Three composable primitives — global key-value, real-time pub/sub, and unified job queues — built for Next.js and Vercel. No config files. No clusters. Just an API key.
Works with Next.js 13+ · App Router · Edge Runtime · Node.js
// Three APIs. One import.
import { createClient } from 'saasignal'
import { NextResponse } from 'next/server'
const ss = createClient(process.env.SAASIGNAL_KEY)
export async function POST(req: Request) {
const { orgId, metric, value } = await req.json()
// Cache at the edge — ~200K writes / $1
await ss.kv.set(`metric:${orgId}`, value)
// Push to live dashboards — ~1M msgs / $1
await ss.channels.publish(`org:${orgId}`, {
event: 'metric.updated',
data: { metric, value }
})
// Queue background work — ~1M jobs / $1
await ss.jobs.create({
trigger: { type: 'immediate' },
handler: 'https://acme.com/api/process',
payload: { orgId, metric, value }
})
return NextResponse.json({ ok: true })
} Queue, Task, and Cron are not different things — they're all "execute a handler, at some point, with retries." The only difference is the trigger.
Sub-millisecond reads from 300+ edge locations. Sessions, feature flags, rate limits, distributed locks — all from a single API.
import { createClient } from 'saasignal'
const ss = createClient(process.env.SAASIGNAL_KEY)
// Edge-fast sessions
await ss.kv.set('session:u_123', {
userId: 'u_123',
role: 'admin',
plan: 'pro',
}, { ttl: 86400 })
// Atomic counters
await ss.kv.increment('ratelimit:u_123')
// Batch operations
const { results } = await ss.kv.batch([
{ op: 'get', key: 'config:flags' },
{ op: 'get', key: 'config:limits' },
]) WebSocket and SSE subscriptions with presence, message history, and fan-out. Build live dashboards in minutes, not months.
// Publish from your API route
await ss.channels.publish('org:acme', {
event: 'metric.updated',
data: { mrr: 42840, delta: +1200 }
})
// Subscribe in the browser
const channel = ss.channels.subscribe('org:acme')
channel.on('metric.updated', ({ mrr, delta }) => {
setMRR(mrr)
})
// Presence — who's online right now
const { users } = await ss.channels.presence('org:acme')
console.log(users.length, 'users online') One primitive replaces three services. Immediate tasks, delayed execution, cron schedules, push queues, pull queues — all with retries and dead-letter.
// Send welcome email in background
await ss.jobs.create({
trigger: { type: 'immediate' },
handler: 'https://app.acme.com/api/on-signup',
payload: { userId: 'u_123' },
max_attempts: 3,
backoff: 'exponential',
})
// Nightly billing digest (cron)
await ss.jobs.create({
trigger: {
type: 'scheduled',
schedule: '0 9 * * *',
timezone: 'America/New_York',
},
handler: 'https://app.acme.com/api/digest',
}) Sign up, create an org, then a project. Takes 30 seconds.
Create a scoped key and add SAASIGNAL_KEY to your Vercel environment.
Run npm install saasignal and import with a single line.
Push to Vercel. KV, Channels, and Jobs are live on 300+ edge locations.
Use SaaSignal from any tool, agent, or framework. We support the protocols developers and AI agents already speak.
First-class typed client for Node.js, Bun, and edge runtimes. Namespaced APIs for KV, Channels, Jobs, and Billing.
npm install saasignalManage KV, Channels, Jobs, and billing directly from your terminal. No code required — just set your API key and go.
npx saasignal kv get mykeyProduction MCP endpoint at /mcp. AI agents connect with an API key and get scope-filtered tools — KV, Channels, Jobs, and more.
{ "type": "http", "url": ".../mcp" }Full OpenAPI 3.1 specification with interactive docs. Generate clients in any language or explore the API in your browser.
/api/openapi.json1 token ≈ $1 of Cloudflare infrastructure cost. Markup is built into top-up bundles & plans — usage itself is at-cost.
Start free. Scale as you grow. No infrastructure costs, ever.
1 token = $1.00 of real Cloudflare infrastructure cost.
Your subscription is how you bundle those tokens cheaply.
Need more? Contact us for enterprise pricing with SLAs.
Get KV, Channels, and Jobs in one API call. Free to start, no credit card required.