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

POST/v1/ingest

Send an event. Returns immediately — delivery is asynchronous via a background queue.

Request body

FieldTypeRequiredDescription
titlestringShort alert title (max 255 chars)
levelinfo | warn | error | criticalSeverity level
sourcestringService or component name (max 100 chars)
messagestringNoDetail, stack trace, or context (max 5000 chars)
fingerprintstringNoCustom dedup key. Auto-generated if omitted

Responses

StatusMeaning
202Queued — event accepted and queued for delivery
200Suppressed — duplicate within the dedup window, not delivered
400Invalid request body
401Missing or invalid API key
429Rate limited — 100 req/min per API key
GET/v1/events

Query event history for the project associated with your API key.

Query parameters

ParamTypeDefaultDescription
statusqueued | delivered | suppressed | failedFilter by delivery status
levelinfo | warn | error | criticalFilter by severity
limitnumber50Results per page (max 100)
offsetnumber0Pagination 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"
GET/health

Health 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.

💬Discord

Webhook URL

Server Settings → Integrations → Webhooks → New Webhook → Copy Webhook URL

💼Slack

Incoming Webhook URL

api.slack.com/apps → Create App → Incoming Webhooks → Activate → Add to workspace

✉️Email

Resend API key + to + from address

Self-hosted only. Requires a Resend account and RESEND_API_KEY env var.

✈️Telegram

Bot token + Chat ID

Create a bot via @BotFather, get the token, and find your chat ID.

🔗Webhook

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 start

Environment variables

VariableRequiredDefaultDescription
PORTNo3000HTTP server port
DATABASE_PATHNo./data/flarely.dbSQLite file path
REDIS_URLNoredis://localhost:6379Redis connection URL
RESEND_API_KEYEmail onlyResend API key for email delivery
DEFAULT_DEDUP_WINDOWNo600Default dedup window in seconds
BULLBOARD_USERNoUsername for queue dashboard
BULLBOARD_PASSNoPassword 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.