---
name: semro-monitoring
description: Koppel automatische taken (cron, pipelines, deploys, backups) aan Semro zodat je een melding krijgt wanneer een taak niet of te laat draait. Gebruik dit wanneer iemand een terugkerende taak betrouwbaar wil bewaken, of een website/server/SSL/domein wil monitoren via Semro (semro.nl).
---

# Semro — bewaak je automatische taken (skill)

Semro (https://semro.nl) is uptime- en taakbewaking. De krachtigste integratie voor
automatisering is de **heartbeat**: jouw taak "pingt" een unieke URL telkens als 'ie
succesvol klaar is. Hoort Semro die ping niet binnen het verwachte interval (+ marge),
dan stuurt het een melding (e-mail/Slack/webhook/push). Zo weet je het meteen als een
cron of pipeline stilvalt — iets dat je anders pas láter ontdekt.

## Kernconcept: heartbeats

1. Maak in Semro een monitor van het type **heartbeat**.
2. Stel het **verwachte interval** in (bijv. elke 24 uur) en een **marge** (grace, bijv. 1 uur).
3. Semro geeft je een unieke **heartbeat-URL**:
   ```
   https://api.semro.nl/api/v1/heartbeat/<token>
   ```
4. Laat je taak deze URL **aan het einde van een geslaagde run** aanroepen (GET of POST).
5. Komt er binnen `interval + marge` geen ping → Semro markeert de taak als **down** en alarmeert.

> Belangrijk: ping alleen bij **succes**. Plaats de ping ná het echte werk, niet aan het begin.

## In Semro instellen (stap voor stap)

1. Log in op https://semro.nl en ga naar **Domeinen → Monitor toevoegen**.
2. Kies bij **Type monitor** de optie **Heartbeat/cron**.
3. Vul een **interne naam** in (bijv. `Nachtelijke backup` of `cron://backup`) — dit is puur een label, geen URL.
4. Stel in:
   - **Verwacht interval** (`expected_interval_seconds`) — hoe vaak de taak hoort te draaien, bijv. `86400` (24 uur).
   - **Speling / grace** (`grace_seconds`) — hoeveel uitloop is toegestaan, bijv. `3600` (1 uur).
5. Klik **Opslaan**. Open daarna de monitor: bovenaan staat de **Heartbeat-URL** met een **Kopieer**-knop:
   ```
   https://api.semro.nl/api/v1/heartbeat/<token>
   ```
6. Plak die URL in je taak/cron (zie voorbeelden hieronder) en laat 'm bij elke **geslaagde** run aanroepen.
7. Meldingen regel je onder **Instellingen → Notificaties** (e-mail, Slack, webhook, push), globaal of per domein.

## Voorbeelden

### Bash / cron
```bash
# ... je taak hier ...
do_backup && curl -fsS -m 10 "https://api.semro.nl/api/v1/heartbeat/<token>" >/dev/null
```

### Crontab (alleen pingen bij exit 0)
```
0 3 * * *  /opt/scripts/backup.sh && curl -fsS https://api.semro.nl/api/v1/heartbeat/<token>
```

### Python
```python
import requests
def task():
    ...  # je werk
if __name__ == "__main__":
    task()
    requests.get("https://api.semro.nl/api/v1/heartbeat/<token>", timeout=10)
```

### GitHub Actions
```yaml
- name: Run job
  run: ./run.sh
- name: Heartbeat
  if: success()
  run: curl -fsS https://api.semro.nl/api/v1/heartbeat/<token>
```

### Laravel scheduler
```php
$schedule->command('reports:generate')
    ->dailyAt('02:00')
    ->onSuccess(fn () => Http::get('https://api.semro.nl/api/v1/heartbeat/<token>'));
```

## Wat Semro met de pings doet (de Semro-kant)

- **Ping ontvangen** → Semro registreert het tijdstip (`last_ping_at`) en houdt/zet de monitor op **operationeel**. Een eerder gemiste status herstelt direct bij de volgende ping.
- **Geen ping binnen `interval + speling`** → Semro zet de monitor op **down**, maakt automatisch een **incident** aan (met "down sinds") en stuurt meldingen via je ingestelde kanalen.
- De **monitor-detailpagina** toont de laatste ping, de status en de incidenthistorie. De heartbeat kan ook op een **statuspagina** en op het **TV-wandbord**.
- De URL accepteert **GET én POST**, heeft géén auth-header nodig (de token in de URL is het geheim — houd 'm privé), en reageert met `200 ok`.
- Geen ping ontvangen tijdens onderhoud? Pauzeer de monitor tijdelijk in Semro, of stuur gewoon door zodra de taak weer draait.

## Andere monitor-types (geen code in je app nodig)
Semro kan ook van buitenaf checken — handig wanneer je niets aan de taak/host wilt toevoegen:
- **HTTP(S)** — status-code + responstijd van een URL.
- **keyword** — controleert of een tekst wel/niet in de pagina staat.
- **port** — TCP-poort bereikbaar (SSH, database, Plesk 8443, ...).
- **ssl** — waarschuwt N dagen vóór een SSL-certificaat verloopt.
- **domain** — waarschuwt vóór domeinregistratie-verloop.
- **server** — VPS/hosting op up/down via ping of poort.

## Statuspagina's
Elke set monitors kan op een publieke (of wachtwoord-beveiligde) statuspagina:
```
https://semro.nl/status/<slug>
```

## Whitelisten (als checks geblokkeerd worden)
Semro's externe checks komen van **User-Agent `SemroBot/1.0`**. Blokkeert je firewall/WAF/Plesk
de checks, sta dan `SemroBot` toe en/of de monitoring-bron-IP's (zie semro.nl/faq voor de actuele lijst).

## Samengevat voor een agent
- Terugkerende taak bewaken → maak een **heartbeat-monitor**, ping de URL bij succes.
- Iets van buitenaf bewaken (site/API/poort/SSL/domein/server) → maak het bijbehorende monitor-type.
- Meer info: https://semro.nl · support@semro.nl
