Maintenance
No change to the API, the proxy or the dashboard.
Improved
-
Maintenance
No change to the API, the proxy or the dashboard.
Releases
Every release, security fix and change to SignalVault, published with a date.
No change to the API, the proxy or the dashboard.
No change to the API, the proxy or the dashboard.
Usage is reported for billing every hour and appears on your next monthly invoice.
Starter, Growth and the new Compliance plan each cover every app in your organization, with requests included every month and usage-based pricing above them. Tax is calculated at checkout.
A plan covers every app in your organization, where each app had its own: Starter ($49 a month, 1 app), Growth ($149, up to 5 apps) or Compliance ($499, unlimited apps). Choose, upgrade, downgrade or cancel from Account › Billing. An upgrade applies at once and the difference for the rest of the billing period is charged then; a downgrade or a cancellation applies at the end of the period, and you can undo it until then. When a plan allows fewer apps than you have, you choose which stay active. The others are paused and keep their rules, keys and history; a request with a paused app's key gets a 402 with the code app_paused and a link to Account › Billing.
Unlimited apps, 250,000 requests a month included, $3 per 1,000 above that, and two years of history. Scheduled exports, SSO and an auditor role are planned for Q1 2027.
Each plan includes requests every month: 10,000 on Starter, 50,000 on Growth and 250,000 on Compliance. Requests above that are billed with the next monthly invoice, at $5, $4 or $3 per 1,000, and going over never stops your requests. You pay for checked requests that reach your provider: blocked and unchecked requests, duplicates of a request and requests whose provider call failed are not billed. Account › Billing shows the requests this period.
Prices exclude tax. Checkout asks for your billing address and adds VAT where it applies. A business in another EU country can enter its VAT number, and the invoice is reverse-charged.
Once an app has sent the sample event from the setup page, its events page shows how to send a real request through the proxy: the base URL, the X-SignalVault-Key header and a cURL command for OpenAI and Anthropic, with which key SIGNALVAULT_API_KEY holds. It goes away when the app's own first request arrives.
No change to the API, the proxy or the dashboard.
No change to the API, the proxy or the dashboard.
No change to the API, the proxy or the dashboard.
No change to the API, the proxy or the dashboard.
A request over the rule-check limit is still recorded, and the SDKs queue and retry audit events.
Above 120 rule checks a minute per app, a request is still recorded in the audit trail, marked unchecked, with whether your SDK sent it on to the provider. No rule runs on it and its prompt is not stored. The dashboard labels unchecked requests and counts them per app. With Node SDK 0.6.0 or Python SDK 0.7.0, its response is recorded too.
Node SDK 0.6.0 and Python SDK 0.7.0 keep audit events in a queue and retry a failed send up to 6 times over about two minutes, without storing anything twice. Closing the client or exiting waits up to 10 seconds for queued events, and any event that is dropped is logged with its event_id and counted. Responses and tool calls do not use rule checks. Every event type shares one ceiling of 3,000 events a minute per app.
Events, proxy requests and dashboard sign-ins each count only towards their own rate limit.
A response's cost is shown to at most eight decimals.
Requests whose prompt was not sampled are listed with an empty preview.
The PII detection page lists the identifiers a new app's PII rule starts with: email addresses, phone numbers, US social security numbers, payment card numbers and IBANs. Every other identifier on the page can be added to the rule.
The free trial includes 1,000 requests and runs for at least 14 days, shared by all your apps.
The trial runs for at least 14 days whatever you send, up to 5,000 requests. From day 14 it ends at 1,000 requests, and on day 60 it ends whatever the count. Choose a plan before the trial ends and requests carry on without a break. The dashboard shows the count and the dates. A request after the trial has ended gets a 429 with the code trial_limit_exceeded and a link to choose a plan.
An account's apps share one trial, where each app had its own, and an account on trial can hold up to 5 apps. If you were on the trial before 21 October, your 14 days start on 21 October and the requests you have already sent count towards the 1,000.
Renewal dates stay accurate when webhooks arrive out of order.
API keys are stored only as an HMAC-SHA256 hash.
Each API key is stored as an HMAC-SHA256 hash, keyed with a secret held outside the database, and looked up by that hash alone. Raw keys are never stored. Existing keys keep working; there is nothing to change.
The event search box finds events by request ID, tool name and the metadata you send with them.
The search box on the events page matches model, provider, request and event IDs, tool names and metadata values, such as a user or session ID. The term is matched as typed, so % and _ are not wildcards. Prompts and responses are encrypted at rest and are not searched.
The audit export holds every field SignalVault stores encrypted, in readable form.
The JSON export decrypts every field SignalVault encrypts: prompts and responses, message lists, tool definitions, tool-call inputs and outputs, and provider error text. Each keeps its key name, such as payload.tool_input_encrypted. An export downloaded before 20 October holds these fields encrypted; download it again for a readable copy.
CSV exports end with an unavailable_fields column, which names any stored field that could not be read and is otherwise empty. A JSON row carries unavailable_fields only when it names a field. If you read CSV exports by column position, allow for the new last column.
The PII rule detects EU VAT numbers, identity and tax numbers from Austria, Belgium, Estonia, Ireland, Poland and Portugal, Swiss AHV numbers and UK NHS numbers.
vat_eu finds VAT numbers from all 27 member states, written with their country prefix (EL for Greece), and confirms each by that country's check digits.
pesel_pl (Poland), rrn_be (Belgium), ppsn_ie (Ireland) and isikukood_ee (Estonia) are confirmed by their check digit or letter, and by the date of birth where the number holds one. nif_pt (Portugal) and svnr_at (Austria) count only after a word that names them, such as NIF or SVNR, on the same line. Each country's code (at, be, ee, ie, pl, pt) can be named in a rule on its own.
ahv_ch finds 13-digit AHV/AVS numbers starting 756, confirmed by their check digit, in a new Switzerland region (ch).
nhs_gb counts a ten-digit number only after NHS, NHS number or NHS no. on the same line, and confirms its check digit.
Rules set to eu detect the VAT numbers and the six EU identity and tax numbers from this release, and rules set to gb detect NHS numbers. Rules that name identifiers one by one are unchanged.
The PII rule detects national identity and tax numbers from Germany, France, Italy, the Netherlands and Spain, and UK National Insurance numbers, and scans long prompts in less time.
steuer_id_de (German tax ID), nir_fr (French social security number), codice_fiscale_it, and dni_es and nie_es (Spain) are confirmed by their check digit or letter, and the codice fiscale also by the date of birth it holds. A Dutch BSN (bsn_nl) counts only after BSN or burgerservicenummer on the same line, and must pass the 11-proef.
nino_gb counts a number only after National Insurance, NI number or NINO on the same line, and ignores prefixes that are never issued.
Tick All of European Union or All of United Kingdom in the rule editor, or name eu or gb in a rule's patterns list. eu also covers IBAN and the Danish, Finnish and Swedish numbers. A country code such as de covers that country's identifiers. /docs/detection lists them.
Most identifiers are found in one pass over the text, so a PII rule scans long prompts in less time.
The PII rule detects IBANs and personal identity numbers from Denmark, Finland, Iceland, Norway and Sweden, each confirmed by its check digits or its date.
iban finds bank account numbers from the SEPA countries, spaced or written as one run, and confirms each by the length its country uses and the mod-97 check digits. Rules set to the Global region detect IBANs from this release.
personnummer_se (including samordningsnummer), fodselsnummer_no (including D-nummer), hetu_fi and kennitala_is are confirmed by the date of birth and check digits. Danish numbers have no check digit, so cpr_dk counts a number only after the word CPR on the same line, and redacts the number alone.
Tick All of Nordics in the rule editor, or name nordics in a rule's patterns list, to detect all five. A country code such as se detects that country's identifiers. /docs/detection lists the names.
The PII rule created with a new app also detects payment card numbers and IBANs. Existing rules are unchanged.
Every identifier the PII rule detects is listed in the docs and the rule editor, and each match is confirmed before it counts.
/docs/detection lists every identifier the PII rule detects, with the name to use in a rule, an example and how a match is confirmed.
Tick a whole region in the rule editor, or name it in a rule's patterns list ("us"), and the rule detects every identifier for that region, including ones added later. Each addition is named in the changelog.
Card numbers must pass their Luhn check digit, IP addresses must have four parts from 0 to 255, US phone numbers need an area code and exchange that can exist, and social security numbers that are never issued are ignored. Order numbers, timestamps and similar values are flagged less often, so a PII rule set to block or redact refuses fewer requests that hold none.
Identifiers are grouped by region, and the rule saves what is ticked. If you edited a PII rule on the dashboard before 18 October, open it and check that card numbers, IP addresses and dates of birth are ticked if you want them detected.
Turning a rule on or off, editing, saving and deleting it on the dashboard act only on rules of the app you are viewing, which is checked against your account.
Tokens read from and written to Anthropic's prompt cache are priced at Anthropic's cache prices, with writes to the 1-hour cache at the 1-hour rate when the usage reports them. Costs for apps that use prompt caching are higher from this release; responses recorded before it keep the cost they were stored with.
Prompts, responses, tool calls and error text are encrypted before they are written. If encryption is unavailable, the event is not stored: the API answers 503 encryption_unavailable, and the same event can be sent again with its event_id. The SDKs retry once on their own.
The site and the API refuse TLS 1.0 and 1.1 and use TLS 1.3 wherever the client supports it.
The changelog, the security page and the blog are rebuilt to be read on any screen, with feeds you can subscribe to.
Each release lists what was added, improved, fixed and secured. Filter the page to one kind, jump to a release from the list beside it, and link to any release directly, as in /changelog#v0.15.9.
Data protection, transport, access control, retention and infrastructure are set out row by row, with a table of every sub-processor and what it receives.
Posts are grouped by topic, show how long they take to read, and carry a list of their sections that follows you down the page.
Subscribe to the changelog at /changelog/feed.xml and to the blog at /blog/feed.xml.
Both pages are linked from the top of every public page, and the page you are on is marked.
If a guardrail on the proxy fails, the log records the kind of error and nothing from the request or response.
A request through the proxy that matches a redact rule is forwarded to your provider with the matched values masked.
Responses from the Claude 4 and Claude 5 models, Haiku 4.5 through Fable 5.1, are priced at Anthropic's list prices. Claude Haiku 5.5 is priced by the request's prompt length.
A request through the proxy that matches a redact rule is forwarded to your provider with the matched values masked. Message text, the Anthropic system field, tool inputs and results, and tool-call arguments are rewritten; the rest of the request is sent as you wrote it. This covers OpenAI and Anthropic, streaming and non-streaming, and the response carries the header x-signalvault-decision: redact. To refuse a matching request instead, set the rule's action to block.
It is evaluated against your rules again and compared with the text stored for the request. It is refused with a 400, and nothing reaches your provider, when the rule's type has nothing to mask, when a match cannot be removed cleanly, or when an exact copy of a masked value (8 bytes or more) is still present elsewhere in the request. The response carries a reason code and a description, and the refusal appears in your dashboard with the same reason.
Rules evaluate the string values in tool inputs and tool-call arguments before a request is forwarded, for OpenAI and Anthropic, through the proxy and on the events API. The values in one tool input are read as lines of one text, so a pattern can match across two adjacent values.
Requests that carry tool calls can be flagged, masked or blocked by your rules. Violation counts and token estimates rise for apps that send OpenAI tool calls, and argument values count toward the 200 KB prompt limit. For Anthropic, stored prompt text lists tool input values one per line, and token estimates fall for requests whose tool inputs are objects.
Keyword rules match keywords next to accented letters and typographic punctuation, in either letter case, so violation counts can rise on such text.
Built-in PII rules match a value directly beside a typographic quote, an accented letter, or non-Latin text such as Chinese or Cyrillic, the way they match a value between spaces. Violation counts can rise on such text.
On Events, the 1h, 24h, 7d and 30d control sets the time range for the event list and for the cards above it.
The request and cost lines show every interval in the selected range, including ones with no activity, so quiet periods show as a drop to zero.
Events, Violations, Costs, Rules and Settings open in place, without a page reload.
Upgrade on the Rules page opens that app's Settings › Billing, where you change its plan. "Manage in Stripe" there covers payment methods, invoices and cancellation.
The Events page and the request page show the most recent response when a response is recorded more than once for the same request.
Costs are recorded from a list price or not at all.
A response is priced when its model is in our price table by exact name. For any other model, no cost is recorded and the dashboard shows that it is not available. You can always send cost_usd on the response to record your own figure.
Costs shows how many responses its totals leave out and which models they used.
A monthly spend limit counts only responses that have a cost. If you use a model that is not in the price table, those responses do not count towards the limit — Settings › Budgets shows how many that is this month. Send cost_usd on the response, or use a daily token limit, which counts every response.
A dated or newly released variant records no cost until it is added. Costs already recorded are unchanged.
For Anthropic, cost is worked out from input and output tokens. Prompt-cache tokens count towards your token budget and are not included in the cost.
The daily token budget, the token figures on Events and the token totals on Costs count requests made through the Anthropic proxy, including tokens read from or written to Anthropic's prompt cache.
This applies to usage already recorded today. If an app has a daily token budget and uses Anthropic, check the limit is still where you want it — an app that is already past it will have its next proxy request refused with a 402 until the next UTC day or until you raise the limit.
For apps that use Anthropic, token totals on the Costs page rise across the past 30 days.
Guardrails run on tool calls whatever your sampling rate, the same as on requests and responses. A tool call whose payload is not stored is still evaluated, and a match is recorded with the rule's decision.
If you use sampling below 100, tool calls that match a rule show as warn, redact or block, and violation counts and alerts reflect all of your traffic. Expect those counts to rise.
A violation on a tool call whose payload was not stored records which rule matched, with no detail from the payload.
Tool calls through the proxy record each violation once, and a model allowlist rule counts a tool call once, by the model it names.
Request sampling applies while an app is on the Growth plan. On every other plan each payload is stored in full.
If you saved a sampling rate on Growth and later moved the app to another plan, it stores full payloads from now on. The saved rate is kept and applies again if the app returns to Growth.
Error reports exclude request headers that carry credentials: authorization, cookie, your SignalVault key, the provider key sent on proxy requests, and the Stripe webhook signature. This applies to every route.
Request bodies are not attached to error reports for API, proxy and webhook requests, so prompts stay out of them. On dashboard pages, form fields that hold a secret and single-use links are masked.
Anything shaped like an API key, bearer token or webhook secret is masked in the text of an error report before it is sent.
The dashboard is now organised around one app at a time, with a guided setup for your first request and an event detail you can link to.
A new app opens on a four-step page: app created, save your API key, send a request, see it arrive. The request step is a ready-to-paste cURL command for OpenAI or Anthropic that reads the key from SIGNALVAULT_API_KEY, so your first request needs no code change. Setup completes when a request of your own gets a response. Skip for now is remembered, and you can return to the page from Setup guide on Events.
Selecting an event opens its detail beside the list. The open event is part of the URL, so you can link to it, reload the page, or close it with the back button.
Apps, Billing, Profile and Security now have their own sections, separate from any single app. The full app list is under Account › Apps.
Your monthly total, next charge and apps on trial, with plan, price and renewal date for each app.
Finds apps as you type, and shows each app's plan with its last event or trial progress.
It takes you to the app you were last in. With no record of one it opens the app with the most recent event, and a new account goes straight to creating its first app.
A segmented period control, a filter menu, and a chip for each active filter that removes it in one click. Changing a filter or the period returns you to the newest events.
Each tool call shows its tool, input and output. Event rows now open from the keyboard too.
Costs under a cent read <$0.01 on Events and Costs, with the exact figure on hover and in the event detail.
Same layout, with each section under its own title. The alerts section is now named Alerts, and a new API key is shown once with Copy key and Copy as .env.
Every dashboard and account page works on phones, tablets and desktop. Creating an app has its own page, and dashboard pages open with their own header.
Every change you make is kept before you save.
Tool-call guardrails now run on streaming responses, which is how most chat interfaces work.
When a model proposes a tool call whose arguments contain PII, secrets or other rule violations, SignalVault redacts the arguments, substitutes a refusal, or forwards the call unchanged — before it reaches your agent.
Guardrails inspect tool results and tool inputs, so detections carry through multi-turn loops where tool output feeds the next model turn.
The documentation at /docs covers response codes and error shapes, rate limits, streaming behaviour, tool-use guardrails, export formats, payload limits and what the default rules do on a first request.
Development, staging and production API keys are available on Starter.
While a tool call is being evaluated it arrives in a single frame rather than token by token. Text content streams as before, and most agent clients do not render tool arguments incrementally.
The Anthropic proxy accepts the x-api-key header used by the official Anthropic SDK. If you configured an Anthropic integration before 29 September, check that your base URL reads https://api.signalvault.io/proxy/anthropic — without /v1, which the Anthropic SDK appends itself. The OpenAI base URL does include /v1, since that client expects it.
Redaction results use a consistent shape across the API and both SDKs, with the SDK reference updated to match.
Sessions persist when you return to SignalVault from an external page — Stripe Checkout, an email verification link, or a link from the documentation. If a subscription or verification did not go through between 3 September and 1 October, it should work now.
The page confirms when you are already signed in and only need to click the link we sent.
Signups that have not confirmed their email receive at most two reminders, and unconfirmed accounts are removed after 30 days.
Subscription renewal dates and plan changes stay accurate when Stripe delivers webhooks out of order.
Signing in from a page that has been open a while recovers cleanly.
Prompt and response payloads are encrypted at rest across every decision — allowed, flagged, redacted and blocked. Error text captured from providers is encrypted as well.
Regular expressions in the rules engine run with bounds against pathological input, request body sizes are capped on ingest and on the proxy, and dependencies are checked against published advisories on every change.
Repeated sign-in and password-reset attempts are rate limited.
Development, staging and production API keys are included on the Starter plan. Trial apps gained this in 0.13.2; it now carries through when you subscribe.
You get an email when your last free trial request is used, so a paused integration is never a surprise.
Trial-limit responses carry an upgrade_url field alongside the existing error type and code, so your client can link a developer straight to billing.
One-click filters for the last hour, 24 hours and 7 days, a live indicator while events are arriving, and new rows highlight as they land.
The proxy base URL shown in Settings and in the setup guide includes the api. subdomain. If you configured an integration before 27 September, check your base URL — it should read https://api.signalvault.io/proxy/openai/v1.
An expired verification link offers to send a new one.
Typography is refreshed, and the mobile navigation menu collapses on small screens.
Reopen it from your app dashboard after you dismiss it.
An account is verified when its owner clicks the button on the verification page, so a link opened by an email scanner does not verify it.
Guardrail block responses link to the dashboard for the environment the request came from.
The export endpoint caps the days parameter at 365, and app ownership is checked on every dashboard view, including live event updates.
Trial apps can create development and staging API keys, so you can evaluate SignalVault locally before pointing production traffic at it.
Upstream provider errors, budget rejections, guardrail blocks and replayed request IDs are not charged.
The environment used to select guardrail rules is taken from your API key.
The "free trial remaining" banner is shown to trial apps only.
The status page links to live uptime history.
Authorization checks are applied across all dashboard views.
Session cookies moved from SameSite=Lax to SameSite=Strict. This returned to Lax in 0.14.0 to keep sessions working across external links.
A security contact is published at /.well-known/security.txt, so researchers have a documented way to report issues.
Failed delivery jobs are detected and recoverable without manual intervention.
Session handling and authentication are consistent across all dashboard views.
The email verification flow recovers from delivery failures.
Each app is strictly scoped to its owner account on every load.
Tool calls in non-streaming proxy mode are captured and audited, alongside streaming requests.
Structured Anthropic content blocks (text, tool_use, tool_result) are each evaluated independently.
Guardrail rules evaluate tool call inputs and outputs on both streaming and non-streaming paths, and violations are recorded for both. In this release, enforcement — blocking or rewriting a proposed tool call — applies to non-streaming responses.
Captured when proxying OpenAI or Anthropic, for streaming and non-streaming requests. No SDK changes required.
A "Tools Offered" section shows which tools were exposed to the model on each request.
The JSON path of the offending field is surfaced on every violation.
Sensitive values are masked while sibling fields stay readable for debugging.
Filter the events list by tool calls alongside requests, violations, errors and budget.
With labels, last-used tracking and revocation.
New events appear in the dashboard without a page reload.
Paging on event lists, 7-day activity counts on app cards, and analytics that refresh automatically.
Cloudflare Turnstile and disposable-email domain blocking on sign-up.
Verification is required before dashboard access, with rate-limited resend.
New sidebar navigation and improved mobile support.
Landing, pricing, blog and documentation pages are refreshed.
The same visual design throughout the app.
With configurable sensitivity: standard and strict modes.
With label support and execution timeout protection.
Case-insensitive, word-boundary matching.
Restrict which AI models an app may use.
Point your existing OpenAI or Anthropic client at SignalVault with a one-line URL change. No SDK required.
Block and redact rules stop requests before they reach the upstream provider.
Streaming (SSE) is supported for both providers. Chunks are forwarded in real time and the response is logged after the stream completes.
For both streaming and non-streaming responses.
Rate limits apply per app (60 requests per minute) rather than per IP.
Send alerts to any HTTPS endpoint. Slack URLs get rich Block Kit messages, all others get plain JSON.
Rules with the redact action mask matched content in stored payloads before write.
See your retention period, total stored events, oldest event date and next purge cutoff.
For policy violations, budget breaches and AI errors, on the Growth plan.
Event types, minimum severity, cooldown and recipient.
Signed-in users can subscribe directly without leaving the page.
Set monthly cost and daily token limits per app, with dashboard alerts when budgets are exceeded.
Export audit logs as CSV or JSON.
Request volume, violation rate and cost tracking.
For Starter and Growth plans.
All prompts and responses are encrypted at rest.
AI request and response logging with a full audit trail.
PII detection, secret scanning, token limits and model allowlists.
Filtering, sorting and request detail views.
With an OpenAI-compatible wrapper and mirror mode.