S’exécute surWrit CloudDesktop
Sur cette page
Moniteurs.
Un moniteur observe une page et signale les changements réels par rapport à une référence. Sur les plans cloud supérieurs, il vérifie jusqu’à toutes les 10 secondes, et un changement détecté peut déclencher un workflow à l’instant où il survient.
Writ s’exécute sur vos propres comptes, avec vos propres identifiants et données, sur les sites que vous êtes autorisé à utiliser.
types ▸ deux vérifications
Deux types de vérification.
Un target est une URL plus un check_type :
| check_type | Ce qui est vérifié |
|---|---|
content | Récupère la page et compare ce que vous surveillez — un sélecteur, la structure ou une zone de capture — à sa référence stockée. |
uptime | Vérifie que la page répond : statut HTTP, temps de réponse, validité du certificat. |
Le rendu JS est un interrupteur à part : activez requires_playwright et la vérification s’exécute dans un vrai navigateur plutôt qu’en simple requête. Une vérification JS pèse 5× une vérification HTML dans le budget de votre plan.
surveiller ▸ trois modes
Ce qu’une vérification de contenu peut surveiller.
Un target de contenu surveille selon l’un de trois modes, chacun avec sa propre référence :
| Mode | Comment le changement est détecté |
|---|---|
selector | Le texte d’un sélecteur CSS, haché puis comparé. Sans sélecteur, c’est la page entière qui est surveillée. |
html | Le balisage structuré, comparé structurellement plutôt que comme texte brut. |
visual | Une zone de capture — visual_region est {x, y, width, height} — comparée à une image de référence stockée. |
Contrôle du bruit : un ignore_regex peut être posé sur le target et sur chaque sélecteur — les fragments correspondants sont retirés de la comparaison, et compteurs comme horodatages cessent de produire de faux changements.
Extracteurs
Sur le contenu d’un sélecteur, des extracteurs transforment la zone en valeurs nommées qui voyagent avec l’événement de changement. Chaque extracteur a une key, un indicateur multiple optionnel et une default_value :
| type | Ce qu’il extrait |
|---|---|
text | Le contenu texte de l’élément. |
attribute | Un attribut nommé de l’élément. |
regex | La première (ou chaque) correspondance d’un motif. |
css | Une sélection CSS imbriquée dans la zone surveillée. |
json_path | Un chemin dans du JSON trouvé dans le contenu surveillé. |
En créer un depuis le code
Sur votre propre machine, les SDKs créent un moniteur auprès de l’agent local et relisent son historique de changements :
monitor.ts
import { WritAgent } from "@usewrit/agent-sdk";
const client = new WritAgent();
const mon = await client.monitors.create({ url: "https://example.com/pricing" });
const history = await client.monitors.changes(mon.id, { limit: 50 });
console.log(mon.id, history); monitor.py
from writ_agent import WritAgent
with WritAgent() as client:
mon = client.monitors.create({"url": "https://example.com/pricing"})
history = client.monitors.changes(mon["id"], limit=50)
print(mon["id"], history) monitor.go
client, err := writ.Discover(ctx)
if err != nil { log.Fatal(err) }
mon, _ := client.Monitors.Create(ctx, map[string]any{"url": "https://example.com/pricing"})
history, _ := client.Monitors.Changes(ctx, mon.ID, nil)
fmt.Println(mon.ID, history) monitor.rs
use writ_client::WritAgent;
use serde_json::json;
let agent = WritAgent::discover().await?;
let mon = agent.monitors().create(json!({ "url": "https://example.com/pricing" })).await?;
let history = agent.monitors().changes_with(mon.id, &[("limit", "50")]).await?; monitor.sh
# Local agent daemon — loopback, wlt_/wlk_ token (use 127.0.0.1, not localhost)
curl -X POST http://127.0.0.1:8131/v1/monitors \
-H "Authorization: Bearer $WRIT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/pricing"}' contexte ▸ autour de la vérification
Vérifications connectées, action dans la même session.
Un target peut porter le contexte dont sa page a besoin — et confier la session en direct à un workflow dès qu’un changement est détecté :
| Champ | Rôle |
|---|---|
pre_check_workflow_id | Un workflow exécuté avant la vérification — typiquement une connexion — pour que la vérification voie la page que voit votre compte. |
on_change workflow | Un workflow déclenché à la détection d’un changement. Il peut s’exécuter dans la même session en direct, et agit donc sur l’état exact que la vérification vient de voir. |
persona_id | La persona dont l’état de connexion sauvegardé est utilisé par la vérification. |
use_residential | Faire passer la vérification par une sortie résidentielle là où votre plan le permet. |
cadence ▸ planchers par plan
Planchers de cadence — rejetés, jamais arrondis.
Chaque plan fixe un intervalle minimal, séparément pour les vérifications HTML et les vérifications avec rendu JS. Un intervalle sous le plancher de votre plan est rejeté avec 402 et le code interval_too_short — il n’est jamais ralenti en silence jusqu’au plancher.
| Plan | Plancher HTML | Plancher JS |
|---|---|---|
| Free | 5 min | 15 min |
| Starter | 1 min | 10 min |
| Pro | 1 min | 10 min |
| Growth | 30 s | 5 min |
| Scale / Enterprise | 10 s | 2 min |
Ce que vous configurez est ce qui s’exécute. Si une demande exige un plan plus rapide, l’API le dit d’emblée au lieu de dégrader votre moniteur en silence.
Deux portes distinctes accompagnent le plancher : un budget pondéré de vérifications par minute sur l’ensemble de vos targets (10 sur Free, jusqu’à 3000 sur Enterprise ; une vérification JS compte 5×) répondu par 402 budget_exceeded une fois épuisé — et un maximum ferme de targets par type de vérification.
pipeline ▸ du changement à l’action
Du changement à l’action.
Quand une vérification aboutit, chaque action déclenchée a parcouru le même pipeline :
- Extraire — Les extracteurs transforment le contenu surveillé en valeurs nommées.
- Apparier — Les déclencheurs qui observent ce target (ou ce sélecteur) sont rassemblés.
- Construire le contexte — Le contexte de template
{{…}}est assemblé : valeurs extraites,now/now_dateet consorts,change_detected_at,target_idet l’URL du target. - Dédupliquer — Les déclencheurs sans sélecteur tirent une fois par (déclencheur, target) et par lot — une vérification ne peut pas doubler la même règle.
- Conditions — Les conditions de chaque déclencheur sont évaluées, plus ses garde-fous : fenêtres horaires et délai de repos.
- Journaliser, distribuer, régler — Le tir est journalisé en pending, les actions partent, et le journal se règle avec status, action_results et trigger_count.
Opérateurs de condition (11) : changed, exists, equals, not_equals, contains, not_contains, matches, gt, gte, lt, lte.
templates ▸ filtres
Filtres de template.
Dans les templates {{…}} — messages, payloads de webhook, entrées de workflow — les valeurs peuvent passer par des filtres :
| Filtre | Ce qu’il fait |
|---|---|
default (alias : or) | Valeur de repli quand la valeur est vide. |
upper / lower | Conversion de casse. |
trim | Retirer les espaces autour. |
truncate:N | Couper à N caractères. |
replace:a:b | Remplacer a par b. |
round[:digits] | Arrondir un nombre, éventuellement à un nombre de décimales. |
add / sub / mul / div | Arithmétique sur valeurs numériques. |
match:<regex> | Garder la correspondance du motif (motifs jusqu’à 512 caractères). |
alertes ▸ neuf canaux
Où partent les alertes.
Les alertes de moniteurs et de déclencheurs partent par neuf canaux : pushover, email, twilio (SMS), whatsapp, signal, webhook, slack, discord et telegram.
Les destinataires s’adressent en chaînes "channel:id" — p. ex. ["pushover:1", "email:3"] — un même déclencheur peut donc s’éventer vers plusieurs destinations configurées à la fois. Les livraisons webhook sortantes sont signées ; voir webhooks.
suite ▸ où aller
Continuez.
- Automatisations & webhooks — le modèle déclencheur/action complet et les livraisons signées.
- Workflows — ce qu’un workflow on_change peut faire une fois déclenché.
- Watch-and-act — l’histoire produit autour de cette référence.