Spikelog docs
Spikelog stores numbers as charts and watches them. Every chart alerts when it spikes, drops or goes quiet, with no setup. Charts are created the first time you send a value.
Quickstart
Create a project, copy its API key from the project settings, then send a number:
curl -X POST https://api.spikelog.com/api/v1/ingest \
-H "X-API-Key: sk_your_key" \
-H "Content-Type: application/json" \
-d '{"chart": "signups", "value": 1}'Open the project in the dashboard and the signups chart is there. Once a chart has some history, alerts start on their own. To have your coding agent do all of this, copy the AI prompt from the code examples on the home page.
Sending data
POST /api/v1/ingest with the header X-API-Key and a JSON body. chart and value are required.timestamp (ISO 8601, defaults to now) and tags (an object up to 4KB) are optional.
{"chart": "checkout_ms", "value": 234, "timestamp": "2026-09-24T10:30:00Z", "tags": {"region": "eu"}}To send up to 100 points in one request, use the batch endpoint. Points that can't be stored come back in rejected; the rest are saved.
POST https://api.spikelog.com/api/v1/ingest/batch
{"points": [{"chart": "signups", "value": 1}, {"chart": "queue_depth", "value": 12}]}
-> {"success": true, "accepted": 2, "rejected": []}Responses: 401 for a wrong key, 422 for a bad body (for example a missing chart name or a non-finite value),429 when you've reached your plan's chart limit.
Patterns that work well: send the actual value for measurements (checkout_ms), 1 per event for counters (signups, then turn on Cumulative mode on the chart for a running total), the current value on a schedule for gauges (queue_depth), and 1 each time a job runs for heartbeats (nightly_backup) so you hear if it stops.
Client libraries
Both libraries batch in the background, never throw into your code, and read SPIKELOG_API_KEY from the environment if you don't pass a key. increment sums counts locally and sends one point per chart per flush; gauge keeps only the latest value.
// npm install spikelog
import { init, log, increment, gauge, flush } from "spikelog"
init({ apiKey: process.env.SPIKELOG_API_KEY })
increment("signups")
log("checkout_ms", 234)
gauge("queue_depth", 12)
// Serverless functions: flush before returning
await flush()# pip install spikelog
import spikelog
spikelog.init() # reads SPIKELOG_API_KEY
spikelog.increment("signups")
spikelog.log("checkout_ms", 234)
spikelog.gauge("queue_depth", 12)Alerts
Every chart has three detectors on by default. You can change them on the chart's page.
- Spike and drop. Each new value is compared with the chart's last 200 points using the median and median absolute deviation, so one earlier outlier doesn't hide the next. It needs at least 30 points of history, and a change has to be both far outside the usual spread and at least 20% away from the typical value. The alert closes by itself when values return to normal.
- Gone quiet. Spikelog learns how often a chart usually receives data (from the gaps between its last 50 points) and alerts when the current gap is much longer: at least 3 times the typical gap, twice the longest usual gap and 15 minutes. It needs 10 points first. You get a second message when data arrives again. Charts silent for more than 30 days are treated as retired.
- Limits. Optional fixed values: alert when the latest value is above or below a number you set.
Mute a chart for a few hours when you know something odd is coming (a launch, a migration). Muted charts still record data and close alerts; they just don't open new ones. Checks run every minute.
Where alerts go
Alerts go to your account email by default. On Pro you can add Slack and Discord incoming webhooks, an ntfy topic for phone push notifications, or any HTTPS webhook. Add them in Settings and use the Test button to check each one.
Webhook deliveries are a JSON POST:
{
"subject": "[Drop] signups · Storefront",
"text": "signups dropped to 1 (down 88% vs a typical 8)",
"link": "https://spikelog.com/dashboard/project/.../chart/signups",
"event": "alert.opened",
"alert": {"id": "...", "kind": "drop", "chart": "signups", "value": 1, "expected": 8, "opened_at": "..."},
"project": {"id": "...", "name": "Storefront"}
}Every Monday you also get a digest email with each chart's week: a daily sparkline, this week's average (or total for counters) and the change from last week. Turn it off in Settings.
MCP for coding agents
The MCP server lets Claude Code, Cursor and other MCP clients work with one project. It authenticates with the project's API key.
claude mcp add --transport http spikelog https://api.spikelog.com/mcp \
--header "Authorization: Bearer sk_your_key"For other clients, point a streamable HTTP MCP server entry at https://api.spikelog.com/mcp with the same header. Tools:
log_metricrecord a valuelist_chartsevery chart with its latest value and open alertsget_chartrecent points, stats and daily historylist_alertsrecent alertsexplain_changecompare the last N hours with the N hours before, including the biggest jumps and other charts that movedset_alert_limitsset limits or turn detectors on and off
Connected sources
Some numbers already live somewhere public. Add a source in project settings and Spikelog fetches it every hour into a chart, with the same alerts as any other chart: GitHub stars for a repository, daily npm downloads for a package, and daily PyPI downloads.
Export
Project settings has two CSV downloads: every stored data point, and the daily summaries (count, average, min, max, sum and last value for each day, all history). You can also call GET /api/v1/projects/{id}/export?kind=points with your session token.
Limits
| Free | Pro ($6/month) | |
|---|---|---|
| Charts | 10 | 100 |
| Recent points per chart | 1,000 | 10,000 |
| Daily summaries | Forever | Forever |
| Alert channels | Email, Slack, Discord, ntfy, webhooks | |
| Connected sources | 1 | 20 |
| Batch size | 100 points | 100 points |
| Badges and embeds | With a Spikelog link | Unbranded |
Uptime is on the status page. Questions go to hello@spikelog.com.