Documentation
Everything you need to send notifications from your app to Discord, Slack, and more.
Quick Start
Get your first alert delivered in under 2 minutes.
1. Create an account
Sign up at app.getflarely.dev with GitHub. Free tier includes 500 events/month — no credit card required.
2. Create a project and add a destination
In the dashboard, click New Project, give it a name, paste your Discord or Slack webhook URL, and save.
3. Send your first event
curl -X POST https://app.getflarely.dev/v1/ingest \
-H "Authorization: Bearer sk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"title": "Payment failed",
"message": "Stripe charge declined: insufficient funds",
"level": "error",
"source": "billing-service"
}'You should see the alert in your Discord or Slack channel within seconds.
API Reference
/v1/ingestSend an event. Returns immediately — delivery is asynchronous via a background queue.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| title | string | ✅ | Short alert title (max 255 chars) |
| level | info | warn | error | critical | ✅ | Severity level |
| source | string | ✅ | Service or component name (max 100 chars) |
| message | string | No | Detail, stack trace, or context (max 5000 chars) |
| fingerprint | string | No | Custom dedup key. Auto-generated if omitted |
Responses
| Status | Meaning |
|---|---|
| 202 | Queued — event accepted and queued for delivery |
| 200 | Suppressed — duplicate within the dedup window, not delivered |
| 400 | Invalid request body |
| 401 | Missing or invalid API key |
| 429 | Rate limited — 100 req/min per API key |
/v1/eventsQuery event history for the project associated with your API key.
Query parameters
| Param | Type | Default | Description |
|---|---|---|---|
| status | queued | delivered | suppressed | failed | — | Filter by delivery status |
| level | info | warn | error | critical | — | Filter by severity |
| limit | number | 50 | Results per page (max 100) |
| offset | number | 0 | Pagination offset |
# All recent events
curl https://app.getflarely.dev/v1/events \
-H "Authorization: Bearer sk_live_your_key_here"
# Only failed deliveries
curl "https://app.getflarely.dev/v1/events?status=failed&limit=10" \
-H "Authorization: Bearer sk_live_your_key_here"/healthHealth check — returns 200 when healthy, 503 when degraded. No auth required.
{
"status": "ok",
"checks": { "db": "ok", "redis": "ok" },
"timestamp": "2026-01-01T00:00:00.000Z"
}Destinations
Each project routes to exactly one destination. Configure it when creating a project in the dashboard.
Webhook URL
Server Settings → Integrations → Webhooks → New Webhook → Copy Webhook URL
Incoming Webhook URL
api.slack.com/apps → Create App → Incoming Webhooks → Activate → Add to workspace
Resend API key + to + from address
Self-hosted only. Requires a Resend account and RESEND_API_KEY env var.
Bot token + Chat ID
Create a bot via @BotFather, get the token, and find your chat ID.
Any HTTPS URL
Posts a structured JSON payload to any URL you provide.
Deduplication
Flarely suppresses repeated alerts within a configurable time window so you don't get spammed when an error fires hundreds of times.
Auto-fingerprint
If you don't pass a fingerprint, one is generated from projectId + title + source + level. The message field is intentionally excluded — so the same error with a slightly different stack trace still deduplicates.
Custom fingerprint
Pass your own fingerprint to control exactly what counts as a duplicate — useful for per-user or per-resource deduplication.
{
"title": "Payment failed",
"level": "error",
"source": "billing",
"fingerprint": "payment-fail-user-42"
}Window behaviour
The default dedup window is 10 minutes. The window resets after it expires — so if the same error fires again 15 minutes later, it will be delivered again. Configure the window per project in the dashboard.
Code Examples
curl
curl -X POST https://app.getflarely.dev/v1/ingest \
-H "Authorization: Bearer sk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"title": "Payment failed",
"message": "Stripe charge declined: insufficient funds",
"level": "error",
"source": "billing-service",
"fingerprint": "payment-fail-user-42"
}'JavaScript / TypeScript
await fetch("https://app.getflarely.dev/v1/ingest", {
method: "POST",
headers: {
"Authorization": "Bearer sk_live_your_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
title: "Payment failed",
message: error.message,
level: "error",
source: "billing-service",
fingerprint: `payment-fail-${userId}`,
}),
});Python
import requests
requests.post(
"https://app.getflarely.dev/v1/ingest",
headers={"Authorization": "Bearer sk_live_your_key_here"},
json={
"title": "Payment failed",
"message": str(e),
"level": "error",
"source": "billing-service",
}
)Go
payload := map[string]string{
"title": "Payment failed",
"level": "error",
"source": "billing-service",
"message": err.Error(),
}
body, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://app.getflarely.dev/v1/ingest", bytes.NewBuffer(body))
req.Header.Set("Authorization", "Bearer sk_live_your_key_here")
req.Header.Set("Content-Type", "application/json")
http.DefaultClient.Do(req)Self-hosting
Flarely is fully open source (AGPL-3.0). Self-host on any server with Node.js 20+ and Redis.
Requirements
- Node.js 20+
- Redis (local, Docker, or Upstash free tier)
Install
git clone https://github.com/flarely/flarely.git
cd flarely
npm install
cp .env.example .env
# Edit .env with your Redis URL and other settings
npm run setup # interactive wizard — creates project + API key
npm run build && npm startEnvironment variables
| Variable | Required | Default | Description |
|---|---|---|---|
| PORT | No | 3000 | HTTP server port |
| DATABASE_PATH | No | ./data/flarely.db | SQLite file path |
| REDIS_URL | No | redis://localhost:6379 | Redis connection URL |
| RESEND_API_KEY | Email only | — | Resend API key for email delivery |
| DEFAULT_DEDUP_WINDOW | No | 600 | Default dedup window in seconds |
| BULLBOARD_USER | No | — | Username for queue dashboard |
| BULLBOARD_PASS | No | — | Password for queue dashboard |
Deploy to Fly.io
cp fly.toml.example fly.toml
fly apps create <your-app-name>
fly volumes create flarely_data --size 1 --app <your-app-name>
fly secrets set \
REDIS_URL=<your-redis-url> \
BULLBOARD_USER=admin \
BULLBOARD_PASS=<strong-password>
fly deploy
# First-time setup
fly ssh console -C "node dist/cli/setup.js"Prefer managed?
Skip the ops overhead. Flarely Cloud is free for 500 events/month and $5/mo for unlimited.