Changelog

New features, improvements, and fixes — newest first.

v0.13.2Reliability2026-06-03

Dashboard resilience polish: pages now recover gracefully from transient errors, the overview no longer flashes stale numbers when you switch vendors quickly, and malformed resource links return a clean 404 instead of a server error.

Improved

  • Graceful error & loading states — an unexpected error while loading a dashboard page now shows a recoverable 'try again' screen instead of a blank or broken page, and pages show a lightweight skeleton while they load. Unmatched URLs get a proper on-brand 404.
  • No more stale overview data — switching vendors, time ranges, or endpoints quickly now cancels the previous request, so a slower earlier response can't resolve late and overwrite the chart with the wrong vendor's numbers.
  • Cleaner not-found handling — requests for malformed resource ids (API keys, notification channels, SLOs, maintenance windows) return a 404 instead of a 500.
v0.13.1Security hardening2026-06-03

A defense-in-depth hardening of outbound alert delivery: webhook and Slack notification URLs are now resolved and checked against internal network addresses before any request is sent, and notification credentials are now masked everywhere they're read back. No action needed — existing public webhook and Slack destinations are unaffected.

Security

  • Outbound URL hardening — webhook and Slack alert destinations are now resolved and validated before delivery, rejecting any that point at private, loopback, link-local, or cloud-metadata addresses. This closes a server-side request forgery (SSRF) vector where a crafted destination could be used to probe internal services. Redirects are no longer followed on alert delivery — each hop is re-validated, so a public URL can't bounce a request onto an internal host.
  • Credential masking — Slack webhook URLs and PagerDuty integration keys are now masked (alongside webhook signing secrets) whenever a notification channel is read back, so credentials never leave the server in plaintext. Editing a channel without re-entering a credential now keeps the stored value intact instead of overwriting it.
  • Signup key handling — the API key issued during signup is now held server-side only while you complete onboarding, instead of in your browser session. The one-time reveal on the onboarding screen is unchanged, and the key still expires after an hour if onboarding isn't completed.
v0.13.0SLA Reporting2026-06-03

Define latency SLOs per vendor or endpoint and track compliance over rolling 30/60/90-day windows. The calendar heatmap shows met (green) and missed (red) days at a glance — a shareable record that proves your dependencies are holding up their end.

Added

  • SLA Reporting page (/dashboard/sla) — define p50/p95/p99 latency SLOs per vendor or endpoint; window toggle (30/60/90 days); calendar heatmap with met/missed/no-data coloring; compliance %, breaching hours, and longest breach run per SLO. Solo and Team plans.
  • Vendor-wide SLOs — when no endpoint is selected, compliance is computed from a true vendor-level percentile (not an average of per-endpoint p95s, which is mathematically incorrect). A new latency_vendor_hourly materialized view handles this.
  • Sample guard — buckets with fewer than 20 requests are excluded from compliance calculations to avoid noise from low-traffic periods.

Collector

  • latency_vendor_hourly materialized view (migration 028) — vendor-level latency aggregates without the endpoint dimension; refreshed alongside latency_hourly by the existing refresh_aggregates job.
  • slo_definitions table (migration 029) — stores per-customer SLO config (vendor, endpoint, metric, threshold, env, default window).
  • GET /v1/slo, POST /v1/slo, DELETE /v1/slo/{id} — SLO definition CRUD (Solo/Team only).
  • GET /v1/sla — compliance report: per-SLO compliance %, breach counts, longest breach run, and day-by-day heatmap data for the selected window.
v0.12.0Model Radar2026-06-01

Model Radar alerts you when your production code is still calling a deprecated or sunset AI model — before the vendor shuts it down and you find out via a 404 in prod. All three SDKs updated to v0.4.0 to extract model names from AI vendor responses.

Added

  • Model Radar page (/dashboard/models) — table of every AI model your code has called, with Active / Deprecated / Sunset status badges and sunset dates. Available on all tiers.
  • Deprecation alerts — daily job checks which deprecated or sunset models you called in the last 24 hours and fires a fan-out alert if you haven't been notified in the last 7 days.
  • SDK v0.4.0 (Ruby, Python, JS) — extracts the model field from AI vendor JSON response bodies (OpenAI, Anthropic, Gemini, Mistral, Cohere) without consuming the response stream. Opt-out via capture_model_names: false.

Collector

  • model_usage table (migration 027) — upserted on every event batch that carries a model name; tracks call_count, first_seen_at, and last_seen_at per customer/vendor/model/endpoint.
  • GET /v1/model-usage — returns model list enriched with deprecation status from the in-repo data/deprecated_models.json catalog.
  • model_deprecation_alert_history table (migration 027) — 7-day per-model deduplication for deprecation alerts.
v0.11.0SDK Onboarding2026-05-29

Six onboarding friction-reduction features shipped across all three SDKs and the collector: smart ignored-host defaults, framework-aware setup output, `setup` and `test` CLI subcommands, a re-engagement email for accounts with no events, and per-account SDK version nudges in the dashboard.

Added

  • apidepth setup — interactive CLI wizard in every SDK (bundle exec apidepth setup, python -m apidepth setup, npx apidepth setup). Detects your framework, generates the correct initializer snippet, and optionally writes it to disk. Fully non-interactive via --api-key + --no-prompt for CI/CD and AI-assisted setup.
  • apidepth test — send a synthetic test event and confirm the collector received it, with per-failure-mode error messages (bad key, unreachable, SSL, timeout) and a hard 5 s timeout.
  • Smart ignored-host defaultslocalhost, 127.0.0.1, 0.0.0.0, ::1, and the collector URL itself are automatically ignored by all three SDKs. Glob patterns (*.internal, *.svc.cluster.local) are now supported everywhere.
  • Framework-aware setup outputsetup detects Rails, Sinatra, Django, FastAPI, Express, and Next.js from project files and generates the framework-correct initializer snippet.
  • No-events-received email — if your account has no events 24 hours after signup, you'll receive a helpful re-engagement email. Suppressed when any event (including test events) has been received. Re-fires after an SDK version bump with no subsequent events.
  • SDK version nudge — the overview page now surfaces per-SDK upgrade banners when your running version is behind the current stable. Breaking-change gaps show a prominent red notice with a migration guide link; minor gaps show a subdued amber banner. Dismissible per-account per version gap.

Collector

  • New test_events table — test events are routed separately and never appear in the vendor list, latency charts, or alerts.
  • New sdk_versions and dismissed_sdk_nudges tables — track current stable releases and per-account dismissals.
  • Retention job now prunes test_events (30-day window) and activation_emails_sent (90-day window).
v0.10.0Dashboard UX2026-05-29

Per-environment data filtering in the sidebar, expanded time ranges, correct vendor display names, and a round of dashboard polish across navigation, empty states, and settings.

Added

  • Environment switcher — a sidebar dropdown filters all dashboard data by environment tag (production, staging, or any value your SDK config passes). Burn-down alerts remain production-only.
  • 1 h and 90 d time ranges — added to the overview and rate-limits pages alongside the existing 24 h, 7 d, and 30 d options.

Improved

  • Vendor display names — AWS, GitHub, OpenAI, HubSpot, PagerDuty, and SendGrid now show correct casing across all pages.
  • Active navigation — sidebar highlights the current page via client-side route detection; Settings and Notifications are treated as distinct entries.
  • Empty states — latency, error rate, and rate-limit charts now show a quickstart nudge when no data has been captured yet.
  • Vendor tab selection — active tab uses a cyan inset ring instead of a heavier background fill.
  • Settings page — Pin, Hide, and Remove controls restyled as bordered ghost buttons; prose instructions replaced with a color-dot legend; Reset to defaults requires a two-step inline confirmation.
v0.9.2Maintenance Windows2026-05-28

Suppress alerts during planned downtime with maintenance windows, plus a round of dashboard and collector bug fixes.

Added

  • Maintenance windows — create time-bounded maintenance windows from the dashboard to suppress all alert fan-out during planned downtime. Solo and Team plans. Windows expire automatically; active windows are shown in the notifications settings page.
  • GET /v1/environments — new collector endpoint returns the distinct environment tags seen for a customer, powering the environment switcher dropdown.

Fixed

  • API key race condition (DASH-024) — SELECT FOR UPDATE added to key-creation path to prevent duplicate keys under concurrent requests.
  • Missing collector URL (DASH-025) — dashboard now throws a clear startup error when NEXT_PUBLIC_COLLECTOR_URL is absent instead of silently failing.
  • Vendor-config 404 (DASH-026) — Prisma P2025 (record not found) on custom vendor DELETE now returns 404 instead of 500.
  • Slack webhook validation (DASH-027) — Slack channel test route checks for a webhook_url before attempting delivery.
  • Free-tier vendor cap in transaction (COL-022) — cap enforcement is now atomic; previously a race could allow a 4th vendor through.
  • Async email delivery (COL-023) — alert emails are sent in a background task so a slow Resend response no longer delays the collector request.
  • Burn-down ratio inversion (COL-024) — rl_remaining / rl_limit was inverted; burn-down risk levels are now correct.
  • rl_reset_at validation (COL-025) — malformed reset timestamps are discarded rather than written as epoch 0.
  • Digest misfire grace period (COL-026) — weekly digest now waits a 5-minute grace window to avoid double-send during rolling deploys.
  • Shared httpx client (COL-030) — probe and collector share a single httpx.AsyncClient with proper connection pooling; fixes resource exhaustion under load.
v0.9.1SDK hardening2026-05-26

Ruby SDK v0.3.0 and Python SDK v0.2.2 — non-blocking startup, cold-start detection, and safer header parsing.

SDK

  • Ruby v0.3.0gem 'apidepth', '~> 0.3'. SDK initialisation is now fully non-blocking: the registry fetch and background flush thread start in a daemon thread so slow collector responses never delay app boot. ReDoS protection added to the path-normalisation regex. Header parsing uses Net::HTTPResponse#[] (case-insensitive) instead of raw @header access.
  • Python v0.2.2pip install apidepth==0.2.2. Cold-start detection via a per-process host registry — first request to each vendor in a process lifetime is flagged cold_start=True. All rate-limit header lookups now normalise to lowercase before extraction, fixing missed headers on servers that capitalise header names.
v0.9.0JavaScript / TypeScript SDK2026-05-24

Full Node.js SDK with parity to Ruby and Python. Patches http, https, and fetch automatically — no per-request changes needed.

Added

  • JavaScript / TypeScript SDKnpm install apidepth. Compatible with Node.js 18+.
  • Auto-instrumentation — call Apidepth.configure({ apiKey }) then Apidepth.instrument() once at startup. Patches node:http, node:https, and globalThis.fetch — no per-request changes needed.
  • Express middlewareapp.use(apidepthMiddleware({ apiKey: process.env.APIDEPTH_API_KEY })) imported from apidepth/integrations/express.
  • Next.js integrationregister() in instrumentation.ts via apidepth/integrations/nextjs for zero-config App Router setup.
  • Rate limit header extraction and cold-start detection included.

SDK

  • npm install apidepth — first npm publish. Node.js 18+. Integrations for Express (apidepth/integrations/express) and Next.js (apidepth/integrations/nextjs) included.
v0.8.0Permanent free tier2026-05-24

The 30-day trial is gone. The free tier is now permanent — track up to 3 vendors with no expiry.

Added

  • Permanent free tier — the trial countdown is removed. Free accounts track up to 3 vendors indefinitely with 7-day data retention and email alerts.
  • Natural upgrade prompt — the moment to upgrade is when your stack grows past 3 vendors, not a deadline. Solo plan adds unlimited vendors and 90-day retention.
v0.7.0Vendor status probes2026-05-23

Real-time synthetic probes for every vendor you depend on — Operational, Degraded, Outage, or Unreachable — updated every 60 seconds.

Added

  • Vendor Status panel — the overview dashboard now shows a live status pill for each API you depend on: Operational, Degraded, Outage, or Unreachable.
  • Synthetic probes — probes run every 60 seconds across major vendors, independent of your SDK traffic.
  • TLS certificate warnings — expiry notices shown inline when a certificate has fewer than 14 days remaining.
  • Active incident summaries — detected incidents listed below each vendor's status pill.
  • Works on quiet days — probe results are independent of SDK event volume, so vendor status is always current even if no requests are flowing.
v0.6.0Notification channels2026-05-22

Fan-out alert delivery to Slack, webhooks, and email — with per-channel filtering and a Python SDK.

Added

  • Notification channels — configure multiple alert destinations per account at /settings/notifications. Each channel can filter by alert type (p95 threshold, error rate, rate limit, quota burn-down) and minimum severity.
  • Slack — paste a Slack incoming webhook URL to receive rich formatted alert messages with vendor name, metric vs baseline, environment, and a dashboard link.
  • Outbound webhooks — POST alert events as JSON to any HTTPS endpoint. Optional HMAC-SHA256 signing via X-Apidepth-Signature header (same convention as GitHub webhooks) so you can verify authenticity.
  • Test delivery — every channel has a Test button that sends a live test payload and shows success or failure inline.
  • Per-channel alert filtering — choose which alert types each channel receives and set a minimum severity (warning or critical only).
  • Tier gating — Slack and webhook channels require Solo plan; PagerDuty (coming) requires Team. Trial accounts receive email alerts only.
  • Python SDKpip install apidepth. Mirrors the Ruby SDK feature set: passive requests and httpx instrumentation, vendor normalisation, rate limit header capture, and custom vendor support.

SDK

  • pip install apidepth — first PyPI publish. Works with requests, httpx, and any library that wraps them.
v0.5.0Proof of Innocence2026-05-21

The dashboard now tells you whether a latency spike is your code or the vendor's — before you spend an hour debugging.

Added

  • Attribution card on the overview dashboard — surfaces a vendor-vs-app blame split for each vendor using real fleet data. Three verdicts: Isolated (your p95 is >20% above fleet median — investigate your code), Tracking (within ±20% of fleet — consistent with vendor-wide issue), Healthy (>20% below fleet — you're doing better than average).
  • Fleet-grounded verdicts — requires at least 10 fleet contributors before showing a verdict; otherwise shows "insufficient fleet data" rather than a false signal.
  • Honest copy — verdicts use "this pattern suggests" language, not "it is definitely Stripe." The goal is fast triage, not false certainty.
v0.4.0Weekly digest2026-05-20

A Monday morning summary of your API dependency health — even on quiet weeks when no alerts have fired.

Added

  • Weekly digest email — sent every Monday at 09:00 UTC to all active accounts. Covers per-vendor p95 trend vs the prior week, error rate summary, and 429 pattern highlights.
  • Smart hook sentence — the email opens with the most important insight first: worst degradation, most improved vendor, or a quiet-week confirmation. No filler copy.
  • Deduplication — a digest_history table prevents re-sends if the job runs twice (e.g. during deploys).
v0.3.0Status page2026-05-18

Self-hosted uptime monitoring with a public status page — no third-party dependency.

Added

  • /status page — live uptime dashboard showing current status, 30d/90d uptime %, a 90-day day-bar history chart, and an incident list.
  • Self-hosted health monitoring — the collector pings its own database every minute and records the result. No Betterstack, no third-party dependency — fully on-brand.
  • GET /v1/status public collector endpoint (no auth required); powers the status page with current status, uptime percentages, daily breakdown, and incident history.
  • Docs site complete — Getting Started, Configuration, Rate Limit Intelligence, and API Reference all live at /docs.
  • Changelog page at /changelog.
v0.2.0Rate Limit Intelligence2026-05-18

Automatic 429 tracking, quota header capture, and burn-down forecasting across all instrumented vendors.

Added

  • Rate Limit Intelligence — tracks 429 responses hourly per vendor and endpoint; visible in the new Rate Limits dashboard page.
  • Burn-down prediction — the Ruby SDK (v0.2.0) now extracts x-ratelimit-*, ratelimit-*, and retry-after headers from every response and sends rl_remaining, rl_limit, and rl_reset_at to the collector.
  • Quota snapshots — one live row per customer/vendor/environment updated on every event batch; no storage bloat.
  • Burn-down alerts — email notification when projected time to quota exhaustion drops below 20 minutes; 30-minute per-vendor cooldown.
  • Reset format normalisation — three formats unified to epoch milliseconds: Unix timestamps, seconds-from-now, and OpenAI duration strings (1m30s, 20ms, 2h).
  • Docs site/docs with Getting Started, Configuration reference, Rate Limit Intelligence, and API reference.
  • RubyGems badge on the landing page.

SDK

  • gem 'apidepth', '~> 0.2' — publish gem v0.2.0 to RubyGems.
v0.1.0Initial release2026-05-15

First public release. Passive outbound latency monitoring for Rails, fleet benchmarks, error rate tracking, and Stripe billing.

Added

  • Passive instrumentationModule#prepend on Net::HTTP captures every outgoing request with zero config changes to call sites. Works with Faraday, HTTParty, RestClient, and plain Net::HTTP.
  • Vendor normalisation — built-in recognition for Stripe, OpenAI, Anthropic, Twilio, Resend, and GitHub; IDs and UUIDs stripped from paths automatically.
  • Latency percentiles — p50/p95/p99 per vendor/endpoint/hour, displayed on the Overview dashboard.
  • Fleet benchmarks — anonymised, opt-in fleet medians and p95s; your numbers plotted against real production data from all users (minimum 10 contributors per vendor/endpoint).
  • Error rate tracking — client (4xx) and server (5xx) error rates per vendor/endpoint/hour.
  • Timeout captureNet::ReadTimeout and Net::OpenTimeout are recorded and re-raised; previously invisible in standard monitoring.
  • Cold-start tagging — first request to a vendor is flagged so warmup latency doesn't inflate percentiles.
  • Threshold alerts — email when your p95 exceeds 2× the 7-day baseline for a vendor; 24-hour deduplication.
  • Custom vendorsconfig.extra_vendors = { "my-api" => "api.myservice.com" } adds private APIs to the dashboard.
  • Multi-environment — Rails.env is captured automatically; production and development tracked separately.
  • Stripe billing — Trial, Solo, and Team plans; Stripe-hosted checkout and billing portal.
  • API key management — generate, list, and revoke keys from the dashboard; one-time plaintext reveal at onboarding.

SDK

  • gem 'apidepth', '~> 0.1' — first RubyGems publish.