Media Luna Media Luna Docs

Media Luna Documentation

Media Luna is a multi-region uptime monitoring platform that gives you real-time visibility into the health and performance of your websites, APIs, servers, and infrastructure. With distributed probes across the globe, you get accurate, location-aware monitoring with instant incident detection and flexible alerting.

💡 What you can monitor
HTTP/HTTPS endpoints, TCP ports, DNS records, SMTP servers, SSH services, ICMP ping, and push-based heartbeats — all from multiple geographic regions simultaneously.

Key Features

🌍
Multi-Region Probes

Checks run from distributed global locations. Confirm incidents from multiple regions to avoid false positives.

30-Second Intervals

Monitor as frequently as every 30 seconds (plan dependent) to catch issues before your customers notice.

🔔
Smart Alerting

Define rules with conditions like response time thresholds and consecutive failures. Route to Slack, email, PagerDuty, webhooks, and more.

📊
Rich Metrics

Time-series data, per-region latency, uptime %, p95 response times, and incident MTTR analytics.

📃
Status Pages

Public, branded status pages so your customers can see the health of your services.

🔑
Developer API

Full REST API with scoped API keys. Automate monitor management from your CI/CD pipeline or infrastructure-as-code.

Quick Start

Get up and running with Media Luna in under 5 minutes.

Prerequisites
You need a Media Luna account. Sign up free →

Step 1 — Create an account

  1. Go to monitor.media-luna.co/register
  2. Enter your email and password
  3. Verify your email address

Step 2 — Create your first monitor

  1. Click Add Monitor from the dashboard
  2. Enter your website URL
  3. Select HTTP as the monitor type
  4. Set check interval to 1 minute
  5. Click Create Monitor

Step 3 — Set up notifications

  1. Go to Notification Channels and verify your email is listed
  2. Go to Notification RulesCreate Rule
  3. Select your monitor and choose when to notify
  4. Pick notification channels and save

Using the API instead?

# Store your API key securely
export MEDIALUNA_API_KEY="sk_live_your_key_here"

# Create a monitor
curl -X POST https://api.media-luna.co/api/v1/monitors \
  -H "Authorization: Bearer $MEDIALUNA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "My Website",
    "type": "HTTP",
    "url": "https://yoursite.com",
    "check_interval": 60
  }'

# Verify it's working
curl https://api.media-luna.co/api/v1/monitors \
  -H "Authorization: Bearer $MEDIALUNA_API_KEY"

Your monitor will start receiving checks within 60 seconds from the assigned probe region. The status will transition from pending to up once the first successful check completes.

Your First Monitor

Let's set up a comprehensive HTTP monitor step by step. This monitor will check your API endpoint from three regions, verify SSL, and confirm failures from multiple locations before triggering an incident.

curl -X POST https://api.media-luna.co/api/v1/monitors \
  -H "Authorization: Bearer $MEDIALUNA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Production API",
    "type": "HTTP",
    "url": "https://api.example.com/health",
    "check_interval": 60,
    "timeout": 15,
    "region_ids": [1, 2, 3],
    "confirm_from_locations": 2,
    "expected_status_codes": [200],
    "verify_ssl": true,
    "ssl_expiry_reminder": 14,
    "follow_redirects": true,
    "request_headers": {
      "Accept": "application/json"
    }
  }'

What happens next

  1. Probe agents in your selected regions pick up the new monitor within 60 seconds
  2. Each probe executes the HTTP check independently at the configured interval
  3. Results are batched and submitted to the backend for processing
  4. If a check fails, the system waits for confirmation from 2 regions before creating an incident
  5. When an incident is created, notification rules are evaluated and alerts are dispatched

Understanding the Dashboard

The Media Luna dashboard gives you a real-time overview of your entire monitoring stack.

Monitor Status Summary

At the top of the dashboard you'll see aggregate counts:

Up
Monitors currently operational and passing checks
Down
Monitors failing checks — active incidents
Degraded
Monitors with slow response times exceeding thresholds
Pending
Newly created monitors awaiting their first check

Monitor Cards

Each monitor card displays the current status indicator, monitor name and URL, latest response time, uptime percentage over the selected time period, and when the last check ran.

Filtering & Search

  • Search bar — find monitors by name or URL
  • Tag filters — show only monitors matching specific tags
  • Status filter — show only down, degraded, or up monitors
  • View toggle — switch between grid (cards) and list (compact) layout

Time Range

Use the time range selector to view uptime and metrics over the last 24 hours, 7 days, 30 days, or 90 days.

Sidebar Navigation

Monitors
Main dashboard — all monitors at a glance
Incidents
Active and historical incidents
Notification Rules
Configure alerting conditions
Notification Channels
Email, Slack, PagerDuty, webhooks
Status Pages
Public status pages for your users
Settings
Account, team, and billing

Authentication Overview

Media Luna uses two distinct authentication mechanisms depending on the context:

Dashboard

JWT Authentication

Used by the React frontend. Tokens are stored in httpOnly cookies and refreshed automatically. You don't need to manage this directly.

Developer API

API Key Authentication

For programmatic access. Keys are prefixed with sk_, scoped to specific permissions, and SHA-256 hashed at rest.

Dashboard Authentication (JWT)

The dashboard uses HTTP-only cookie-based JWT authentication. When you sign in, the backend sets two cookies:

Cookies
access_token
Short-lived JWT (15 min). Contains user ID, account ID, and role. httpOnly, Secure, SameSite=Lax.
refresh_token
Long-lived token (7 days). Used to silently refresh the access token. httpOnly, Secure, SameSite=Lax.
Security note
JWT tokens are never exposed to JavaScript (httpOnly). CSRF protection is handled via SameSite cookies. All cookies require HTTPS in production.

API Key Authentication

API keys provide programmatic access to the Developer API endpoints (prefixed /api/v1/).

Creating API Keys

  1. Navigate to Settings → API Keys in the dashboard
  2. Click "Create API Key" and provide a descriptive name
  3. Select the scopes you need (least privilege recommended)
  4. Copy and securely store the key — it's only shown once

Using API Keys

# Include in the Authorization header
curl https://api.media-luna.co/api/v1/monitors \
  -H "Authorization: Bearer sk_live_abc123..."

Key Permissions

Read Only
List monitors, get status, list incidents, view metrics
Read/Write
All read permissions + create/update monitors, create incidents, manage notification rules

Key Security

  • Keys are SHA-256 hashed before storage — we cannot retrieve your full key
  • Only the prefix (sk_live_abc) is stored in plaintext for identification
  • Set expiration dates for keys used in CI/CD or temporary integrations
  • Rotate keys regularly and revoke unused keys
  • Never commit keys to source control — use environment variables

Roles & Permissions

Media Luna uses a three-tier role system. Roles are assigned at the user level and apply account-wide.

Permission Viewer Editor Admin
View monitors & metrics
View incidents
Create/edit/delete monitors
Acknowledge/snooze incidents
Manage notification rules
Manage team members
Manage billing & plan
Delete account

System Architecture

Media Luna follows a distributed architecture with clear separation between the API backend, probe agents, and the frontend dashboard.

┌─────────────────┐     ┌──────────────────────────────────────────┐
│   React App     │────▶│           FastAPI Backend                │
│   (Dashboard)   │◀────│  • REST API    • Auth (JWT + API Keys)   │
└─────────────────┘     │  • Incidents   • Notification Rules      │
                        │  • Billing     • Plan Limits             │
┌─────────────────┐     │  • Metrics     • Status Pages            │
│  Developer API  │────▶│                                          │
│  (sk_xxxxx)     │◀────└──────┬──────────────┬────────────────────┘
└─────────────────┘            │              │
                               │              │
                    ┌──────────▼──┐    ┌──────▼──────┐
                    │  PostgreSQL  │    │    Redis     │
                    │  (Primary)   │    │  • Cache     │
                    │  • Accounts  │    │  • Rate Lim  │
                    │  • Monitors  │    │  • Pub/Sub   │
                    │  • Incidents │    │  • Heartbeat │
                    │  • Metrics   │    └─────────────┘
                    └─────────────┘
                               ▲
         ┌─────────────────────┼─────────────────────┐
         │                     │                     │
┌────────┴────────┐  ┌────────┴────────┐  ┌────────┴────────┐
│  Probe Agent    │  │  Probe Agent    │  │  Probe Agent    │
│  us-east-1      │  │  us-west-1      │  │  eu-west-1      │
│  ┌────────────┐ │  │  ┌────────────┐ │  │  ┌────────────┐ │
│  │ Fetcher    │ │  │  │ Fetcher    │ │  │  │ Fetcher    │ │
│  │ Scheduler  │ │  │  │ Scheduler  │ │  │  │ Scheduler  │ │
│  │ Executor   │ │  │  │ Executor   │ │  │  │ Executor   │ │
│  │ Batcher    │ │  │  │ Batcher    │ │  │  │ Batcher    │ │
│  └────────────┘ │  │  └────────────┘ │  │  └────────────┘ │
└─────────────────┘  └─────────────────┘  └─────────────────┘

Multi-Tenancy

Media Luna is a multi-tenant platform with strict account-level data isolation. Every resource (monitors, incidents, metrics, users, notification channels, etc.) belongs to an account.

⚠️ Data Isolation
  • ALL database queries filter by account_id
  • The account_id is always derived from the authenticated user — never from request bodies
  • Cross-account access returns 404 (not 403) to avoid leaking resource existence
  • All write operations verify ownership before proceeding

Account Hierarchy

# Every account has a plan that defines resource limits
Account
  ├── Plan (Free / Starter / Professional / Enterprise)
  ├── Users (Admin, Editor, Viewer)
  ├── Monitors
  │     ├── Metrics
  │     ├── Incidents → Timeline Events
  │     └── Tags
  ├── Notification Channels (Email, Slack, PagerDuty, ...)
  ├── Notification Rules → Conditions
  ├── Status Pages
  ├── Maintenance Windows
  └── API Keys

Probe Network

Probes are high-performance async Python agents deployed across geographic regions. Each probe can handle 10,000–30,000 concurrent health checks using uvloop and asyncio.

Probe Components

Fetcher
Polls the backend API every 60s for monitor assignments. Only fetches monitors assigned to its region.
Scheduler
Manages check timing with jitter. Respects concurrency limits (global: 300, per-target: 5).
Executor
Executes health checks using protocol-specific clients (HTTP, TCP, DNS, SMTP, SSH, ICMP).
Batcher
Collects results into batches of 64, gzip-compresses them, and submits to the backend.

Probe Registration

Probes are dynamic. When a new probe starts, it registers with the backend, making its region available for assignment. This means you can scale probe coverage by simply deploying new instances.

# Probe configuration (docker-compose.yml)
probe-us-east:
  environment:
    AGENT_ID: "probe-us-east-1"
    REGION: "us-east-1"
    BACKEND_URL: "http://backend:8000"
    GLOBAL_CONCURRENCY: 300
    PER_TARGET_CONCURRENCY: 5
    BATCH_SIZE: 64

Region Confirmation

To prevent false positives caused by transient network issues, Media Luna supports multi-region confirmation. When enabled, a monitor must report a failure from N different probe regions before an incident is created.

# Example: Require 2 regions to confirm failure
{
  "name": "Critical API",
  "confirm_from_locations": 2,
  "region_ids": [1, 2, 3]
}

Region confirmation status is tracked in Redis with TTL-based expiration, ensuring stale failure signals don't persist. The backend uses a RegionConfirmationService that maintains a set of confirming regions per monitor and only creates an incident when the threshold is met.

Data Flow

Here's how a single health check flows through the system:

  1. Fetcher polls /api/probe/monitors and receives monitors assigned to its region
  2. Scheduler queues the check at the configured interval with randomized jitter
  3. Executor performs the health check (HTTP, TCP, DNS, etc.) and records response time in milliseconds
  4. Batcher collects the result and, when batch size is reached, gzip-compresses and POSTs to /api/probe/results
  5. Backend processes results: updates monitor status, stores metrics, evaluates region confirmation
  6. If status changes (UP→DOWN or DOWN→UP), an Incident is created/resolved
  7. Notification Rule Evaluator checks all rules against the new state
  8. Matching rules dispatch alerts via the Notification Manager to configured channels

Monitor Types

Media Luna supports seven check protocols plus push-based heartbeats:

HTTP
HTTP/HTTPS

Full HTTP request with status code validation, response body matching, SSL verification, custom headers, and follow-redirect support. Supports GET, POST, PUT, PATCH, DELETE, HEAD.

TCP
TCP Port

Verifies a TCP port is open and accepting connections. Useful for databases (MySQL 3306, PostgreSQL 5432), message queues (Redis 6379), and custom services.

DNS
DNS Records

Validates DNS resolution for A, AAAA, CNAME, MX, NS, and TXT records. Alerts on propagation issues or unexpected changes. Query specific nameservers.

SMTP
SMTP Mail Server

Tests SMTP server connectivity with optional STARTTLS and authentication.

SSH
SSH Server

Verifies SSH port is accepting connections and responding with a valid protocol banner.

PING
ICMP Ping

Basic ICMP echo (ping) check. Verifies host is reachable at the network level. Note: some hosts and cloud load balancers block ICMP.

PUSH
Push / Heartbeat

Your service sends periodic pings to a unique URL. If a heartbeat isn't received within the expected interval, an incident is triggered. Ideal for cron jobs, background workers, and batch processes.

Check Configuration

Each monitor type supports specific configuration options:

HTTP Options

expected_status_codes
HTTP status codes considered successful (default: 200-299)
request_headers
Custom headers sent with each check (e.g., Accept, API keys)
request_body
Request body for POST/PUT checks
http_method
HTTP method (GET, POST, PUT, PATCH, DELETE, HEAD)
follow_redirects
Whether to follow 3xx redirects (default: true)
verify_ssl
Validate SSL certificate chain (default: true)

Timing

check_interval
Seconds between checks. Minimum depends on plan (Free: 300s, Starter: 120s, Pro: 60s, Enterprise: 30s)
timeout
Request timeout in seconds (default: 30, max: 120)

Choosing the Right Interval

30 seconds
Critical services — production APIs, payment systems, core infrastructure (Enterprise)
1 minute
Standard monitoring — websites, most APIs, internal tools (Pro+)
5 minutes
Less critical services — marketing sites, documentation, background services (all plans)

Heartbeat / Cron Job Monitoring

Heartbeat monitors (also called push monitors) invert the usual model: instead of Media Luna reaching out to check your service, your service periodically pings a unique Media Luna URL. If a ping isn't received within the expected window, an incident is triggered. This is ideal for cron jobs, background workers, queue consumers, and any process that should run on a schedule.

Creating a Heartbeat Monitor

  1. Go to Monitors → Add Monitor
  2. Select Heartbeat / Push as the type
  3. Set the expected interval — how often your service will ping (e.g. every 5 minutes for a 5-minute cron)
  4. Set the grace period — how late a ping can arrive before an incident is triggered (e.g. 2 minutes)
  5. Click Create Monitor — Media Luna generates a unique ping URL for this monitor

Integrating the Ping URL

Copy the generated ping URL and add an HTTP GET request at the end of your job:

# Cron job example (bash)
#!/bin/bash
# Run your job first
python /app/scripts/nightly_report.py

# Signal success to Media Luna
curl -s "https://hb.media-luna.co/ping/abc123xyz" --max-time 5 --silent || true
# Python example (schedule library)
import requests

def my_job():
    # ... do work ...
    requests.get("https://hb.media-luna.co/ping/abc123xyz", timeout=5)
# crontab entry
*/5 * * * *  /usr/bin/python3 /app/worker.py && curl -s https://hb.media-luna.co/ping/abc123xyz

How It Works

Interval
How often your service is expected to ping. If a ping doesn't arrive within interval + grace period, an incident is triggered.
Grace period
A buffer to accommodate slow jobs or minor scheduling delays. Set this to the maximum acceptable latency for your job.
Auto-resolve
When the next ping arrives after an incident, the incident is automatically resolved.
Always ping after success, not before
Place the ping call at the end of your job, after all work completes. If the job fails partway through, the ping won't be sent and an incident will trigger — exactly the behaviour you want.

Next steps: Set up notification rules for this monitor →

SSL Certificate Monitoring

HTTP monitors with verify_ssl: true automatically monitor SSL certificate validity. Use ssl_expiry_reminder to get notified before your certificate expires.

Example
Set ssl_expiry_reminder: 14 to receive an ssl_expiry incident 14 days before your certificate expires.

What's tracked

  • Certificate validity and expiration date
  • Certificate chain completeness
  • Domain name match
  • Issuer information

Common Issues

Expired
Renew through your certificate authority or hosting provider
Chain incomplete
Ensure all intermediate certificates are installed on your server
Domain mismatch
Certificate doesn't match the monitored domain — check your cert configuration
Self-signed
Install a certificate from a trusted CA, or disable SSL verification (not recommended for production)

Domain Expiry Monitoring

Media Luna checks your domain expiration dates via WHOIS lookups and creates an incident before your domain lapses. An expired domain instantly takes your entire service offline — recovery can take days and often costs more than the renewal itself.

Enabling Domain Expiry Reminders

Set the domain_expiry_reminder field on any HTTP monitor to receive an advance warning incident before your domain expires:

curl -X POST https://api.media-luna.co/api/v1/monitors \
  -H "Authorization: Bearer $MEDIALUNA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "example.com domain",
    "type": "HTTP",
    "url": "https://example.com",
    "domain_expiry_reminder": 30
  }'

In the example above, Media Luna opens a domain_expiry incident 30 days before the domain expires, giving you ample time to renew.

How WHOIS Monitoring Works

Media Luna periodically performs WHOIS lookups for the domain of your HTTP monitor's URL. The expiration date is parsed from the WHOIS record and compared to the current date. When the remaining days fall at or below your configured reminder window, an incident of type domain_expiry is created and your notification rules are evaluated.

Recommended Reminder Windows

30 days
Recommended minimum — gives you time to renew before it becomes urgent
60 days
Good for production domains — combine with a 30-day reminder rule for two advance notices
90 days
High-value domains — maximum advance warning for annual renewals
Enable auto-renew with your registrar
Domain expiry monitoring is a safety net — not a substitute for auto-renewal. Enable auto-renew with your registrar and use Media Luna as a backup alert in case payment fails or auto-renew is accidentally disabled.

Next steps: SSL Certificate Monitoring →

Tags & Organization

Use tags to organize, filter, and group your monitors effectively.

Creating Tags

Go to any monitor's settings, find the Tags field, type a tag name and press Enter — or select from existing tags.

Recommended Naming Conventions

Environment
production, staging, development
Team
backend, frontend, devops
Service
api, web, database
Priority
critical, high, low
Tip
Use colon-separated hierarchies like team:backend or env:prod for consistent organization. Keep it to 3–5 tags per monitor.

Bulk Monitor Import

If you're migrating from another monitoring tool or setting up monitoring for many services at once, Media Luna supports bulk import via CSV or JSON. Import hundreds of monitors in seconds without creating each one individually.

CSV Import

Navigate to Monitors → Import and upload a .csv file. Required columns are name and url; all others are optional and fall back to platform defaults.

# monitors.csv
name,type,url,check_interval,tags
Production API,HTTP,https://api.example.com/health,60,"production,api,critical"
Staging Site,HTTP,https://staging.example.com,300,"staging,web"
Mail Server,SMTP,mail.example.com,300,"production,email"
Auth Service TCP,TCP,auth.example.com:443,60,"production,auth"

JSON Import

For more control, upload a JSON array of monitor objects. Every field supported by the Create Monitor API endpoint can be specified.

[
  {
    "name": "Production API",
    "type": "HTTP",
    "url": "https://api.example.com/health",
    "check_interval": 60,
    "region_ids": [1, 2],
    "expected_status_codes": [200],
    "tags": ["production", "api"],
    "verify_ssl": true
  },
  {
    "name": "Database Port",
    "type": "TCP",
    "host": "db.example.com",
    "port": 5432,
    "check_interval": 60,
    "tags": ["production", "database"]
  }
]

Smart Domain Discovery

Media Luna can automatically suggest monitors based on a root domain. Enter example.com in the Smart Discovery tool and Media Luna scans for common subdomains and services (www, api, mail, status, etc.), presenting a checklist you can import in one click.

Import Validation

Before monitors are created, the import validates each row for required fields and plan limits. A preview screen shows which rows will succeed and which have errors, so you can fix issues before committing the import.

Plan limits apply
The import stops if it would exceed your plan's monitor limit. Upgrade your plan or delete unused monitors before importing large batches.

Maintenance Windows

Schedule maintenance windows to pause alerting during planned downtime. When a monitor is in a maintenance window, checks still run (preserving your uptime data) but incidents are not created and no notifications are sent.

Creating a Maintenance Window

  1. Go to Monitors and select one or more monitors
  2. Click Schedule Maintenance (or use the bulk actions menu)
  3. Set the start and end date/time in your account timezone
  4. Optionally add a description (e.g. "Database migration v2.1")
  5. Click Schedule

Recurring Maintenance

For services with regular maintenance schedules (nightly backups, weekly deployments), configure a recurring window:

Daily
Repeats every day at the same time (e.g. nightly backup window 02:00–03:00)
Weekly
Repeats on the same day each week (e.g. Sunday deployment window)
Monthly
Repeats on the same date each month (e.g. 1st-of-month patch window)

Behaviour During Maintenance

  • Active incidents are automatically resolved when the window starts
  • Failures during the window are silently recorded in metrics but do not trigger incidents
  • Uptime percentage calculations can optionally exclude maintenance windows for accurate SLA reporting
  • When the window ends, normal monitoring resumes immediately
Communicate maintenance to your users
Post a scheduled maintenance announcement on your status page before the window starts so subscribers know the downtime is expected.

Next steps: Organizing Monitors with Tags →

Incident Lifecycle

Incidents are automatically created when a monitor's status changes to DOWN (or other failure conditions). Each incident follows a clear lifecycle:

TRIGGERED  ──▶  ACKNOWLEDGED  ──▶  RESOLVED
    │                                        ▲
    │             SNOOZED                  │
    │                │                       │
    └────────────────┴───────────────────────┘
           (auto-resolves when UP)

Incident Types

downtime
Monitor is unreachable or returning unexpected status codes
ssl_expiry
SSL certificate is expiring within the configured reminder window
performance
Response time exceeds notification rule threshold

Timeline Events

Every incident maintains a timeline of events for post-mortem analysis. Events are automatically created for lifecycle transitions, and you can add manual comments.

CREATED
Incident was triggered
ACKNOWLEDGED
Someone is investigating
SNOOZED
Notifications temporarily paused
RESOLVED
Monitor recovered (auto or manual)
COMMENT
Manual note added by a team member
ESCALATED
Escalated to a higher-priority channel

Acknowledging Incidents

Acknowledging an incident signals to your team that someone is aware of and investigating the issue.

How to Acknowledge

  • Incidents list — Click the Acknowledge button next to the incident
  • Incident detail — Click Acknowledge in the header
  • Email notification — Click the acknowledge link in the alert email
  • Slack notification — Click the acknowledge action in the Slack message

What Happens

  1. Incident status changes to Acknowledged
  2. Your name and timestamp are recorded in the timeline
  3. Your team sees the incident is being handled
  4. Optionally pauses repeated notifications
Acknowledge ≠ Resolve
Acknowledging means "I'm looking at this." The incident remains active. Resolve it when the issue is actually fixed or the monitor recovers automatically.

Snoozing Alerts

Snoozing temporarily pauses notifications for an incident without resolving it. Useful during planned maintenance, known issues being worked on, or after-hours incidents you'll handle later.

How to Snooze

  1. Open the incident
  2. Click Snooze
  3. Select duration: 30 minutes, 1 hour, 4 hours, 8 hours, until tomorrow, or custom
  4. Optionally add a note explaining why

Behavior

  • Notifications are paused for the duration
  • Incident remains active and visible
  • Snooze event is recorded in the timeline
  • Can be cancelled early or renewed
  • When the snooze expires, if the incident is still active, notifications resume

Flap Prevention

Flapping occurs when a monitor rapidly alternates between UP and DOWN states, generating a flood of redundant notifications. Media Luna provides two mechanisms to prevent this: consecutive check thresholds in notification rules, and multi-region confirmation on monitors.

Consecutive Check Thresholds

Set consecutive_checks on a notification rule to require that a condition be met N times in a row before a notification fires. This eliminates noise from transient blips.

{
  "name": "Confirmed downtime alert",
  "consecutive_checks": 3,  // 3 consecutive failures required
  "conditions": [
    { "type": "STATUS", "operator": "eq", "value": "down" }
  ],
  "channel_ids": [1]
}

Choosing the Right Threshold

1 (immediate)
Alert on the first failure. Best for critical payment or authentication services where every second counts.
2–3 checks
Good balance for most production services. Filters transient errors without significant delay.
5+ checks
Suitable for non-critical services or flaky third-party dependencies. Only alerts on persistent outages.

Multi-Region Confirmation

Use confirm_from_locations to require that multiple probe regions independently observe the failure before an incident is created. This prevents false positives caused by a single probe's connectivity issue. See Region Confirmation →

Combine both for best results
Use confirm_from_locations: 2 on the monitor combined with consecutive_checks: 2 on the notification rule for robust false-positive prevention on critical monitors.

Incident Comments & Timeline

Every incident has a chronological timeline that records automatic lifecycle events and manual team communications. Use comments to document your investigation, capture findings, and build a complete post-mortem record.

Adding a Comment

  1. Open the incident from the Incidents list
  2. Scroll to the Timeline section at the bottom
  3. Type your message in the comment box
  4. Click Add Comment

Comments are visible to all team members with access to the incident. Use them to share:

  • Investigation findings ("Checked logs — elevated error rate on db-replica-2")
  • Steps taken ("Restarted the service at 14:32 UTC")
  • External links ("See runbook: https://wiki.example.com/runbooks/db")
  • Root cause analysis once the incident is resolved

Via the API

curl -X POST https://api.media-luna.co/api/incidents/156/timeline \
  -H "Authorization: Bearer $MEDIALUNA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"message": "Root cause identified: misconfigured load balancer rule. Fix deployed at 15:10 UTC."}'

Timeline Event Reference

CREATED
Automatic — incident triggered by monitor status change
ACKNOWLEDGED
Automatic — records who acknowledged and when
SNOOZED
Automatic — records snooze duration and optional reason
COMMENT
Manual — text notes added by team members
ESCALATED
Automatic — incident escalated to a higher-priority channel
RESOLVED
Automatic — monitor recovered or manually resolved
Post-mortems
The full timeline is available via GET /api/incidents/{id} for export into post-mortem templates. It includes precise timestamps, user attribution, and MTTR data.

Notification Rules

Notification rules are separate from incidents. Incidents represent what happened; rules define when and how to alert.

Creating a Rule

  1. Go to Notification Rules
  2. Click Create Rule
  3. Select monitors (all, specific, or by tag)
  4. Configure trigger conditions
  5. Select notification channels
  6. Save the rule

Rule Conditions

Each rule has one or more conditions that must be met before a notification fires:

{
  "name": "Slow response alert",
  "conditions": [
    {
      "type": "RESPONSE_TIME",
      "operator": "gt",
      "value": 2000          // milliseconds
    }
  ],
  "consecutive_checks": 3,  // must fail 3 times in a row
  "channel_ids": [1, 3]
}
Response times are in milliseconds
Probes report response time in milliseconds and it's stored as-is. When setting RESPONSE_TIME conditions, use millisecond values (e.g., 2000 for 2 seconds).

Example Configurations

Critical API
Trigger: monitor goes down, consecutive failures: 1, channels: Slack + PagerDuty + Email
Standard website
Trigger: monitor goes down, consecutive failures: 3, channels: Email
Performance alert
Trigger: response time > 2000ms, consecutive: 5, channels: Slack

Escalation Policies

Escalation policies ensure unacknowledged incidents eventually reach the right people. When a notification is sent but nobody acknowledges within a configured window, Media Luna escalates by notifying a secondary set of channels or individuals.

How Escalation Works

  1. A notification rule fires and sends alerts to the primary channels
  2. If the incident is not acknowledged within the escalation delay, a second notification goes to escalation channels
  3. Escalation can be chained — if still unacknowledged after another delay, a third tier fires
  4. Escalation stops automatically when the incident is acknowledged or resolved

Configuring Escalations

Add escalation steps to any notification rule via the dashboard or API:

{
  "name": "Critical API — with escalation",
  "channel_ids": [1],  // primary: Slack #alerts-critical
  "escalation_steps": [
    {
      "delay_minutes": 15,
      "channel_ids": [2]  // after 15 min: PagerDuty on-call
    },
    {
      "delay_minutes": 30,
      "channel_ids": [3, 4]  // after 30 min: SMS to engineering lead
    }
  ]
}

Escalation vs. Repeated Notifications

Escalation
Notifies a different set of channels after a delay — best for ensuring human response when primary responders are unavailable
Repeated notifications
Re-notifies the same channels at intervals — best for persistent reminders to the same team
Acknowledge to stop escalation
Escalation stops as soon as any team member acknowledges the incident. Encourage your team to acknowledge immediately when investigating so colleagues aren't paged unnecessarily.

Tag-Based Routing

Instead of selecting specific monitors in a notification rule, target monitors by their tags. This makes rules dynamic — any monitor with a matching tag is automatically included, even those created after the rule was written.

Setting Up Tag-Based Rules

  1. Go to Notification Rules → Create Rule
  2. Under Monitors, choose By Tag
  3. Enter one or more tag names (e.g. production, critical)
  4. Configure conditions and channels as normal

Example Routing Strategy

Tag: critical
Route to Slack #alerts-critical + PagerDuty. 1 consecutive failure, immediate escalation.
Tag: production
Route to Slack #alerts-prod + Email. 3 consecutive failures before alerting.
Tag: staging
Route to Slack #alerts-staging only. 5 consecutive failures — staging can be noisy.
Tag: team:backend
Route to the backend team's channel so the relevant squad is notified directly.
Tag naming tip
Use a consistent colon-separated hierarchy like env:production or team:backend across all monitors. This makes routing rules precise and predictable.

Next steps: Monitor Tags & Organization →

Notification Channels

Channels define how alerts are delivered. Media Luna supports six channel types:

📧 Email
Send alerts to an email address. Supports rich HTML templates with incident details.
💬 Slack
Post to a Slack channel via incoming webhook. Includes structured blocks with monitor details and action buttons.
📟 PagerDuty
Trigger PagerDuty incidents with automatic resolution on recovery.
📱 SMS
Send SMS alerts for critical monitors (Twilio-powered).
🔗 Webhook
POST JSON payloads to your custom endpoint for integrations.
✈️ Telegram
Send alerts to a Telegram chat or group via bot.

After configuring a channel, always click Test to verify delivery before relying on it for production alerts.

Webhooks

When using the Webhook notification channel, Media Luna sends a POST request with a JSON payload to your configured URL on each alert.

Payload Format

{
  "event": "incident.triggered",
  "timestamp": "2026-03-21T09:15:00Z",
  "incident": {
    "id": 156,
    "status": "triggered",
    "incident_type": "downtime",
    "message": "HTTP 503 Service Unavailable"
  },
  "monitor": {
    "id": 12,
    "name": "Payment API",
    "url": "https://payments.example.com/health",
    "type": "HTTP"
  },
  "check": {
    "response_time_ms": null,
    "status_code": 503,
    "region": "us-east-1"
  }
}

Webhook Events

incident.triggered
New incident created
incident.acknowledged
Incident was acknowledged
incident.resolved
Incident was resolved (monitor recovered)
ssl.expiring
SSL certificate nearing expiry

Verifying Webhook Signatures

If you set a secret, Media Luna includes a signature header:

X-Media-Luna-Signature: sha256=abc123...

Verify by computing HMAC-SHA256 of the raw payload body using your secret.

Retry policy
Webhook deliveries are retried up to 3 times with exponential backoff (5s, 30s, 2min) if your endpoint returns a non-2xx status code or times out (10s).

Slack Integration

Receive incident notifications directly in your Slack workspace.

Setup

  1. Go to Notification ChannelsAdd ChannelSlack
  2. Click Connect to Slack and authorize Media Luna in your workspace
  3. Select the channel for notifications
  4. Click Test to verify the connection

What You'll Receive

Incident Triggered
Monitor name, status, error details, and a link to the incident
Incident Resolved
Monitor name, incident duration, and resolution details

Multiple Channels

Route different alerts to different Slack channels:

  • #alerts-critical — production monitors only
  • #alerts-staging — staging environment
  • #engineering — all alerts for visibility

PagerDuty Integration

Connect Media Luna with PagerDuty for enterprise on-call incident management.

Getting Your Integration Key

  1. Log in to PagerDuty → ServicesService Directory
  2. Select or create a service for Media Luna alerts
  3. Go to Integrations tab → Add Integration
  4. Select Events API v2
  5. Copy the Integration Key

Setup in Media Luna

  1. Go to Notification ChannelsAdd ChannelPagerDuty
  2. Paste your Integration Key
  3. Name the channel and click Save
  4. Click Test to send a test incident

Incident Mapping

Media LunaPagerDuty
TriggeredTriggered
AcknowledgedAcknowledged
ResolvedResolved

Email Notifications

Email is the default notification channel. Your account email automatically receives incident alerts.

Adding Recipients

  1. Go to Notification ChannelsAdd ChannelEmail
  2. Enter the email address
  3. Recipient verifies their email via a confirmation link

Email Content

Triggered
Subject: [TRIGGERED] Monitor Name is DOWN — includes monitor details, error info, and a link to the incident
Resolved
Subject: [RESOLVED] Monitor Name is UP — includes incident duration and resolution details

Troubleshooting

  • Check your spam/junk folder
  • Verify the email address is correct in Notification Channels
  • Make sure you have notification rules configured for the monitor
  • Whitelist [email protected]

Microsoft Teams Integration

Send incident notifications directly to a Microsoft Teams channel using an Incoming Webhook connector.

Setup

  1. In Microsoft Teams, open the channel where you want to receive alerts
  2. Click (More options) next to the channel name → Connectors
  3. Find Incoming Webhook and click Configure
  4. Give it a name (e.g. "Media Luna Alerts") and optionally upload an icon
  5. Click Create and copy the webhook URL
  6. In Media Luna, go to Notification Channels → Add Channel → Microsoft Teams
  7. Paste the webhook URL and click Save
  8. Click Test to send a test card to your channel

What You'll Receive

Media Luna sends an Adaptive Card to your Teams channel with color-coded status, monitor name, incident type, error message, and a direct link to the incident in the dashboard.

Microsoft 365 requirement
Incoming Webhooks require a Microsoft 365 subscription and the Teams connector must be enabled by your tenant admin. If connectors are disabled in your organization, contact your IT department.

Discord Integration

Deliver monitoring alerts to a Discord server channel via Discord's built-in webhook support.

Setup

  1. In Discord, open your server and go to the channel where you want alerts
  2. Click the gear icon (Edit Channel) → IntegrationsWebhooks
  3. Click New Webhook, give it a name, and optionally set an avatar
  4. Click Copy Webhook URL
  5. In Media Luna, go to Notification Channels → Add Channel → Discord
  6. Paste the webhook URL and click Save
  7. Click Test to verify the connection

What You'll Receive

🔴 Incident Triggered
Embed with red accent — monitor name, error details, region, and incident link
🟢 Incident Resolved
Embed with green accent — monitor name, incident duration, and resolution time
🟡 SSL / Domain Expiry
Embed with yellow accent — domain, expiry date, and days remaining
Separate channels per environment
Create separate Discord notification channels for #alerts-production and #alerts-staging, then use tag-based notification rules to route accordingly.

Telegram Integration

Receive monitoring alerts via Telegram — great for on-call engineers who prefer mobile notifications or for teams that use Telegram as their primary communication platform.

Setup

  1. Open Telegram and search for @BotFather
  2. Send /newbot and follow the prompts to create a bot
  3. Copy the API token BotFather provides
  4. Start a chat with your new bot (or add it to a group) and send any message to it
  5. Retrieve your chat ID by visiting: https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates
  6. In Media Luna, go to Notification Channels → Add Channel → Telegram
  7. Enter your bot token and chat ID, then click Save
  8. Click Test to send a test message

Chat Target Options

Direct Message
Use your personal chat ID for private on-call notifications to a single engineer
Group Chat
Add the bot to a group and use the group's chat ID for team-wide alerts
Channel
Use a Telegram channel for broadcast-style status announcements to subscribers
Bot must have posting permission
For the bot to post in a group or channel, it must have at least the Post Messages permission. Add the bot as an admin or adjust permissions in the group settings.

SMS Notifications (Twilio)

SMS notifications provide the highest-urgency delivery for critical incidents. Media Luna uses Twilio to send text messages worldwide. SMS is ideal for on-call scenarios where the recipient may not be near a computer or have push notifications enabled.

Setup

  1. Go to Notification Channels → Add Channel → SMS
  2. Enter the phone number in E.164 format (e.g. +14155552671)
  3. Click Send Verification Code — a 6-digit code is texted to the number
  4. Enter the code to confirm ownership of the number
  5. Click Save

Message Format

SMS alerts are concise for readability on any device:

⚠ TRIGGERED: Payment API is DOWN
Error: HTTP 503 Service Unavailable
Region: us-east-1
https://app.media-luna.co/incidents/156

✅ RESOLVED: Payment API is UP
Duration: 4m 32s
https://app.media-luna.co/incidents/156
Plan availability
SMS is available on Starter plans and above. Free plans are limited to email only.
International numbers
Supported in 180+ countries. Standard carrier delivery rates may apply.
Reserve SMS for critical monitors
SMS alert fatigue can cause important pages to be ignored. Reserve SMS channels for your highest-severity monitors and pair with consecutive_checks: 1 so you're only paged for confirmed outages.

Creating a Status Page

Status pages let you communicate service availability to your users with a branded, public-facing page.

Setup

  1. Go to Status Pages in the sidebar
  2. Click Create Status Page
  3. Set the page name and subdomain (your-name.media-luna.co)
  4. Select which monitors to display
  5. Click Publish

Adding Monitors

Select which monitors appear on your page. Rename them for public display:

Internal name
prod-api-cluster-1
Public name
API Services

Component Groups

Organize monitors into logical groups for your audience:

  • Core Services: API, Website, Database
  • Integrations: Slack, Webhooks, Email
  • Regional: US, EU, Asia

Customizing Status Pages

Make your status page match your brand.

Visual Options

Logo
Upload PNG, JPG, or SVG (recommended: 200×50px)
Brand Color
Primary color for header accent, status indicators, and buttons
Favicon
Custom browser tab icon (optional)
Footer
Company name, copyright, and additional links

Custom Domain (Pro+)

Use your own domain for a professional look:

  1. Add a CNAME record pointing to Media Luna
  2. Enter your domain in status page settings
  3. SSL certificate is automatically provisioned

Visibility Settings

Control who can view your status page.

Public
Anyone can access — no authentication required. Indexed by search engines. Best for customer-facing services.
Password Protected
Users enter a page password to view. Simple and effective for internal stakeholders.
IP Whitelist
Restrict to specific IP addresses. Great for office networks. Can combine with password.
Authenticated (Enterprise)
Require login — integrates with your SSO for secure access.

Status Page Email Subscribers

Allow your users and stakeholders to subscribe to your status page for automatic email notifications when a component goes down, recovers, or when you post a public incident update. Subscribers opt in voluntarily, keeping you compliant with email regulations.

How Subscription Works

  1. A visitor to your status page clicks Subscribe to Updates
  2. They enter their email address
  3. They receive a confirmation email and click to verify their subscription
  4. They will now receive email notifications for the status page's components

Managing Subscribers

In your status page settings, go to the Subscribers tab to:

  • View all active subscribers and their subscription date
  • Manually add subscribers (useful for internal stakeholders)
  • Remove individual subscribers
  • Export the subscriber list as CSV

What Triggers Subscriber Emails

Component Down
Sent when a component transitions to degraded or outage status
Component Recovered
Sent when a component returns to operational status
Incident Update
Sent each time you post a public update to an ongoing incident
Plan limits
The number of subscribers per status page depends on your plan. See Plan Comparison for details. Enterprise plans support unlimited subscribers.

Posting Incident Updates

During an outage, keeping your users informed reduces support ticket volume and builds trust. Use incident updates on your status page to communicate what happened, what you're doing about it, and when you expect resolution.

Creating a Public Update

  1. Navigate to your Status Page in the dashboard
  2. Find the active incident in the Active Incidents section
  3. Click Post Update
  4. Select a severity label: Investigating, Identified, Monitoring, or Resolved
  5. Write your message and click Publish

Updates are immediately visible on your public status page and emailed to all subscribers.

Update Status Labels

Investigating
You've been notified of an issue and are determining the cause. Post within 5–10 minutes of any outage.
Identified
Root cause found. Describe what it is and what remediation is underway.
Monitoring
Fix deployed — watching to confirm stability before declaring full resolution.
Resolved
Service fully restored. Include a brief post-mortem summary if appropriate.

Scheduled Maintenance Announcements

Post advance notice for planned maintenance directly on your status page:

  1. Go to your status page → Schedule Maintenance
  2. Set the start and end time, affected components, and a description
  3. Publish — subscribers receive the notice immediately
  4. Another notification is sent when the window starts and again when it ends
Communication best practices
Post an "Investigating" update within 5 minutes of any outage, even if you don't yet know the cause. Silence during an incident erodes customer trust faster than admitting uncertainty.

Next steps: Managing Subscribers →

Uptime Report

The Uptime Report provides a historical view of availability for each of your monitors. Use it to understand long-term reliability trends, identify monitors with recurring issues, and share availability data with stakeholders.

Accessing the Report

  1. Navigate to Reports → Uptime in the sidebar
  2. Select the time range: 7 days, 30 days, 90 days, or custom
  3. Filter by tag, monitor type, or specific monitors
  4. Export to CSV or PDF for sharing

Report Metrics

Uptime %
Percentage of check intervals where the monitor was UP. Calculated as: (total_checks − failed_checks) / total_checks × 100
Total Downtime
Cumulative duration the monitor was in a DOWN state during the period
Incident Count
Number of distinct outage incidents opened in the period
MTTR
Mean Time To Resolve — average time from incident creation to resolution

Uptime Calculation

Uptime is calculated from check results, not incident records. Each check is either a success or failure; uptime % is the ratio of successes to total checks. Maintenance windows can be excluded from the calculation so planned downtime doesn't penalise your uptime score.

Data availability depends on your plan
Report data is available for your plan's retention window: Free (1 day), Starter (7 days), Professional (30 days), Enterprise (90 days). Upgrade to access longer historical data.

Performance Report

The Performance Report provides detailed response time analytics across your monitors. Identify slow endpoints, track improvements after optimisations, and set SLO targets for response time.

Key Metrics

Average response time
Mean response time across all checks in the selected period
p50 (median)
50th percentile — half of all checks completed faster than this value
p95
95th percentile — a key indicator of tail latency; 1 in 20 users experiences at least this response time
p99
99th percentile — worst-case latency excluding extreme outliers
Max
Highest single recorded response time — useful for identifying timeout events

Per-Region Breakdown

Response times are reported per probe region, letting you identify geographic performance disparities. If your API responds in 80 ms from us-east but 400 ms from eu-west, you may benefit from deploying a CDN or edge node closer to European users.

Time-Series Charts

The performance report includes a time-series chart of response times overlaid with incident markers. This makes it easy to correlate slow response periods with deployments, traffic spikes, or infrastructure events.

Next steps: SLA Compliance Report →

SLA Compliance Report

The SLA Report helps you measure and communicate compliance against uptime targets. Whether you have contractual SLAs with customers or internal SLOs, this report provides the data you need.

Setting SLA Targets

Define an SLA target per monitor in monitor settings. Common targets and their allowed downtime:

99.9% ("three nines")
~8.7 hours/year · ~43 min/month — suitable for standard production services
99.95%
~4.4 hours/year · ~21 min/month — typical for critical B2B services
99.99% ("four nines")
~52 min/year · ~4.3 min/month — requires highly available, redundant architecture

Report Contents

Compliance status
Green/Red indicator: did you meet your SLA target for the period?
Achieved uptime %
Actual measured uptime vs. your configured target
Error budget
How much downtime allowance remains in the current period before the SLA is breached
Incident summary
List of incidents in the period with duration, type, and resolution time

Exporting SLA Reports

Export as PDF for sharing with customers or leadership, or as CSV for importing into your own dashboards and ticketing systems. Reports can be scheduled for automatic monthly delivery to specified email recipients.

Exclude maintenance windows
When calculating SLA compliance, you can exclude maintenance windows so planned downtime doesn't count against your SLA targets.

Next steps: Uptime Report →

Account Settings

Click your profile icon and select Settings, or navigate from the sidebar.

Profile

Name
Displayed to your team members
Email
Used for login, password recovery, and default notifications
Password
Minimum 8 characters — enter current password to change

Preferences

Theme
Light, Dark, or System (follows OS setting)
Timezone
Determines timestamps across the dashboard

Team Management

Invite team members and manage access to your Media Luna account. Requires Admin role.

Inviting Members

  1. Go to Settings → Team
  2. Click Invite Member
  3. Enter their email address and select a role
  4. Click Send Invitation

The invitee receives an email, clicks the invitation link, creates an account (or links an existing one), and gets immediate access.

Managing Members

  • Change role — Click the role dropdown next to any member
  • Remove member — Click Remove and confirm
  • Pending invitations — View, resend, or cancel outstanding invites
Best practices
Have at least 2 admins for redundancy. Use the principle of least privilege — give each person the minimum role they need. Audit roles quarterly.

Two-Factor Authentication

Add an extra layer of security with TOTP-based two-factor authentication.

Enabling 2FA

  1. Go to Settings → Security
  2. Click Enable Two-Factor Authentication
  3. Scan the QR code with your authenticator app (Google Authenticator, Authy, 1Password, etc.)
  4. Enter the 6-digit verification code
  5. Save your backup codes — each code can be used once if you lose your authenticator

Logging In with 2FA

  1. Enter email and password as usual
  2. Open your authenticator app
  3. Enter the 6-digit code

Lost Access?

Plan Comparison

Media Luna offers four plans to fit teams of any size:

Feature Free Starter Professional Enterprise
Monitors 5 25 100 Unlimited
Check Interval 5 min 2 min 1 min 30 sec
Regions per Monitor 1 2 5 Unlimited
Team Members 1 3 10 Unlimited
Status Pages 1 3 10 Unlimited
Notification Channels Email All All All + Custom
Data Retention 1 day 7 days 30 days 90 days

Limits & Quotas

Resource creation is validated against your current plan. When a limit is reached, the API returns a 403 with a descriptive error message.

// Example: Monitor limit reached
{
  "detail": "Monitor limit reached. Your Free plan allows 20 monitors. Upgrade to create more.",
  "status_code": 403
}

// Example: Region limit exceeded
{
  "detail": "Region limit exceeded. Your Starter plan allows 2 regions per monitor.",
  "status_code": 403
}

Rate Limits

API requests
100 requests/minute per API key
Auth endpoints
10 requests/minute (login, register, password reset)
Webhook endpoints
30 requests/minute

Approaching Limits

You'll be notified when reaching 80% of your monitor or team member limits. If you exceed limits after a downgrade, existing resources continue working but you cannot create new ones until usage is reduced.

Check your current usage at any time via the Usage & Limits API endpoint.

Billing Management

Manage your subscription, payment methods, and invoices from Settings → Billing. Requires Admin role.

Upgrading Your Plan

  1. Go to Settings → BillingUpgrade Plan
  2. Select your new plan
  3. Enter payment information
  4. Confirm — new limits apply immediately

Billing is prorated: you pay the difference for the remaining days in your current cycle.

Payment Methods

Accepted: Visa, Mastercard, American Express, Discover. Payments processed securely via Stripe (PCI DSS compliant). We never store full card numbers.

Invoices

View all past invoices in Settings → Billing → Billing History. Each invoice shows the date, amount, payment method, and status. Download PDF invoices for accounting.

Downgrading

Go to Settings → Billing → Change Plan. The downgrade takes effect at the end of your current billing period. Make sure you're within the new plan's limits before the switch.

Cancellation & Data Export

You can cancel your Media Luna subscription at any time. There are no long-term contracts or cancellation fees. Your account transitions to the Free plan at the end of your current billing period — you will not be charged again.

How to Cancel

  1. Go to Settings → Billing
  2. Click Cancel Plan
  3. Select a cancellation reason (optional, but helps us improve)
  4. Click Confirm Cancellation

Your paid features remain active until the end of the billing period. After that, the account automatically moves to the Free plan with its associated limits.

What Happens on Downgrade to Free

  • Monitors above the Free limit (20) are paused — not deleted
  • Team members above the Free limit (1) retain read-only access until removed
  • Check intervals revert to the Free minimum (5 minutes)
  • Status pages above the Free limit (1) are unpublished but preserved
  • Historical data beyond 7 days becomes inaccessible (retained for 30 days if you re-upgrade)

Exporting Your Data Before Cancellation

Export your data from Settings → Data Export before cancelling:

Monitor configurations
JSON export of all monitor settings, tags, and region assignments
Incident history
CSV export of all incidents and their timelines within your retention window
Metrics data
CSV of response time and uptime data within your retention window

Full Account Deletion

To permanently delete your account and all data, go to Settings → Danger Zone → Delete Account. This action is irreversible. All monitors, incidents, metrics, team members, status pages, and billing history will be permanently erased within 30 days. Database backups are purged within 90 days.

⚠️ Export before deleting
Account deletion cannot be undone. Download all data exports before proceeding. If you're unsure, cancel your paid plan and let the account lapse to Free — your data remains safe and you can re-upgrade at any time.

Security Overview

Media Luna is built with security as a top priority.

Infrastructure

Data Centers
AWS infrastructure with SOC 2 compliant facilities and geographic redundancy
Network
DDoS protection, Web Application Firewall, TLS 1.3 encryption
Access Control
Principle of least privilege, multi-factor authentication, regular access audits

Application

Password Hashing
bcrypt with automatic salting
Encryption at Rest
AES-256 for stored data
Encryption in Transit
TLS for all connections
Security Testing
Regular penetration testing, vulnerability scanning, intrusion detection

Reporting Vulnerabilities

Found a security issue? Report responsibly to [email protected]. We respond within 24 hours and maintain a bug bounty program.

Data Privacy

What We Collect

Account Data
Email, name, password (hashed)
Monitor Data
URLs/endpoints you monitor, configurations, check results, metrics
Usage Data
Login times, feature usage, browser/device info

What We Don't Do

  • We don't sell your data
  • We don't share with advertisers
  • We don't read your application data

Your Rights

Access
Request a copy of your data at any time
Correction
Update incorrect information
Deletion
Request deletion of your account and all data
Export
Download your data in standard formats

Privacy questions: [email protected]

Data Retention

Data is retained based on your plan:

Data TypeFreeStarterProEnterprise
Check results1 day7 days30 days90 days
Incidents7 days30 days90 days1 year
Metrics1 day7 days30 days90 days
Audit logs30 days90 days1 year3 years

Account Deletion

When you delete your account, all data is deleted within 30 days and backups are purged within 90 days. Export your data before deletion if needed.

Compliance

SOC 2 Type II
In progress
GDPR
Fully compliant — DPA available, EU data residency option, privacy controls
CCPA
California Consumer Privacy Act compliant
HIPAA
Available for Enterprise customers with BAA

Data Residency

Choose where your data is stored: United States (default), European Union, or custom regions (Enterprise).

Documentation

Available on request: security questionnaires, penetration test summaries, architecture documentation, and vendor security assessments.

Compliance inquiries: [email protected]