> ## Documentation Index
> Fetch the complete documentation index at: https://docs.happyuptime.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Create your first monitor

Three minutes from sign-up to your first multi-region check.

# Create your first monitor

**Sign in or sign up**

Go to [happyuptime.com/sign-up](https://happyuptime.com/sign-up). Email + password, or Google OAuth.

  **Decide what to check**

The fastest path is an HTTP check against your homepage or `/health` endpoint. If your service is internal, pick [heartbeat](/guides/heartbeat-cron) instead.

  **Create the monitor**

**Dashboard**

Click **+ New monitor** in the dashboard sidebar. Pick **HTTP**, paste your URL, leave defaults (60s interval, 3 regions on free, no assertions). Click **Test** to confirm the URL is reachable, then **Create**.
      **CLI**

```bash
        npm i -g happyuptime-cli
        happy login
        happy monitors create \
          --name "My App" \
          --url https://myapp.com \
          --interval 60
        ```
      **cURL**

```bash
        curl -X POST https://happyuptime.com/api/v1/monitors \
          -H "Authorization: Bearer hu_your_api_key" \
          -H "Content-Type: application/json" \
          -d '{
            "name": "My App",
            "url": "https://myapp.com",
            "type": "http",
            "interval_seconds": 60
          }'
        ```

  **Confirm it's running**

Within 60 seconds your monitor will receive its first check from each configured region. Refresh the monitor detail page — you should see a green status, response time, and a timing waterfall (DNS / connect / TLS / TTFB / transfer).

  **Wire up alerts (recommended)**

A monitor without alerts is just a dashboard. Set up at least one channel:

    - [Slack with @-mentions](/integrations/slack) — best
    - [Discord webhook](/api/alerts/channels)
    - [Email](/api/alerts/channels)

## What gets checked

For an HTTP monitor with default settings:
- TCP connect succeeds
- TLS handshake succeeds
- Response status is 2xx (override with `expected_status_codes`)
- Response received within 30s (override with `timeout_ms`)

If the page contains a marketing iframe or a payment widget you want to verify rendered correctly, enable [visual regression](/concepts/screenshots).

## Common gotchas

**My check fails but the site loads in my browser**

Three causes most often:
    1. Your firewall blocks Cloudflare Worker IPs. Add `*.cloudflare.com` egress to your allowlist.
    2. Your site requires a `User-Agent` that isn't `Mozilla/...`. Add a custom header.
    3. Your site is geo-blocked from one of the regions. Disable that region or pick a different one.

  **Status flickers between up and degraded**

Increase the confirmation period. Either set `confirmation_period_s: 120` (require 2 minutes of consistent down) or remove a flaky region.

  **I want to skip checks during a known maintenance window**

Set `maintenance_start` / `maintenance_end` (HH:MM) and `maintenance_days` (`[1,3]` for Mon/Wed). Checks within the window return `unknown`, no alerts.