Migration from Svix
Migrating from Svix to HookSniff is straightforward. The APIs are similar — HookSniff was designed as a Svix-compatible alternative with more features and a generous free tier.
Why Migrate?
Generous Free Tier
10,000 webhooks/month free. No credit card required.
More Delivery Methods
HTTP, WebSocket, Email, and more. Svix is HTTP-only.
Smart Routing
Round-robin and failover routing built-in.
Real-time Streaming
SSE streaming for live delivery monitoring.
30+ API Resources
Billing, analytics, alerts, SSO, connectors, and more.
11 SDKs
Node, Python, Go, Rust, Ruby, Java, Kotlin, PHP, C#, Elixir, Swift.
SDK Changes
If you're using the Svix SDK, the migration is mostly a package rename. The API structure is similar:
Node.js
// Before (Svix)
import { Svix } from 'svix';
const svix = new Svix({ token: 'sk_live_xxx' });
const endpoints = await svix.endpoint.list('app_id');
// After (HookSniff)
import { HookSniff } from 'hooksniff';
const hs = new HookSniff({ apiKey: 'hr_live_xxx' });
const endpoints = await hs.endpoint.list();
// Note: No app_id needed — HookSniff uses JWT authenticationPython
# Before (Svix)
from svix.api import Svix
svix = Svix(token="sk_live_xxx")
endpoints = svix.endpoint.list("app_id")
# After (HookSniff)
from hooksniff import HookSniff
hs = HookSniff(api_key="hr_live_xxx")
endpoints = hs.endpoint.list()
# Note: No app_id neededGo
// Before (Svix)
import "github.com/svix/svix-webhooks/go"
client := svix.NewClient("sk_live_xxx")
endpoints, _ := client.Endpoint.List(ctx, "app_id", nil)
// After (HookSniff)
import hooksniff "github.com/servetarslan02/hooksniff-go"
hs := hooksniff.NewClient("hr_live_xxx")
endpoints, _ := hs.Endpoint.List(ctx, nil)
// Note: No app_id neededAPI Differences
| Feature | Svix | HookSniff |
|---|---|---|
| Authentication | Bearer token per app | JWT + API key (user-level) |
| App concept | Multi-app (app_id required) | Single account (no app_id) |
| Endpoint URL | /api/v1/app/{app_id}/endpoint/ | /v1/endpoints/ |
| Message URL | /api/v1/app/{app_id}/msg/ | /v1/webhooks/ |
| Signature header | svix-id, svix-timestamp, svix-signature | webhook-id, webhook-timestamp, webhook-signature |
| Free tier | Limited (500/day) | 10,000/month |
| SDK languages | 6 | 11 |
Signature Verification Changes
Both Svix and HookSniff use the Standard Webhooks spec. The only difference is the header names:
// Svix headers
svix-id → webhook-id
svix-timestamp → webhook-timestamp
svix-signature → webhook-signature
// The algorithm is identical:
signed_content = "{webhook-id}.{webhook-timestamp}.{body}"
signature = "v1," + base64(hmac_sha256(secret, signed_content))
// Your existing verification code works with HookSniff!
// Just update the header names in your handler.Step-by-Step Migration
- Create HookSniff account
Sign up at
hooksniff.vercel.app. Get your API key from Settings → API Keys. - Replace SDK
Uninstall Svix SDK, install HookSniff SDK. Update imports and initialization.
- Create endpoints
Use the HookSniff API or dashboard to create endpoints. Copy the signing secrets.
- Update webhook handler
Change header names:
svix-id→webhook-id, etc. - Update API calls
Remove
app_idparameters. Update endpoint URLs if using raw HTTP. - Test & go live
Use the Playground to test. Monitor deliveries in the dashboard. Switch production traffic.
Need Help?
<MessageSquare size={16} strokeWidth={1.75} className="inline-block align-text-bottom mr-1" /> GitHub Discussions
Ask questions and get help from the community.
<Bug size={16} strokeWidth={1.75} className="inline-block align-text-bottom mr-1" /> Report Issues
Found a bug? Let us know on GitHub.
<Mail size={16} strokeWidth={1.75} className="inline-block align-text-bottom mr-1" /> Contact Support
Reach out to the HookSniff team directly.
<Gamepad2 size={16} strokeWidth={1.75} className="inline-block align-text-bottom mr-1" /> Playground
Test webhooks interactively before going live.