API, CLI et MCP
Nous proposons trois façons d'accéder à ton compte, avec les mêmes limites que ton forfait.
API
REST, depuis un pipeline, un script ou tes propres outils. Un token que tu émets et révoques toi-même.
CLI
Un simple fichier Python, rien à installer. Il utilise l'API. Cela peut être utilisé par quelqu'un dans un terminal : liste ce qui est hors ligne, ajoute ou mets à jour des monitors.
MCP
Via le serveur MCP, tu peux laisser Claude ou tout ce qui parle le protocole que l'agent comprend lire ton compte et y apporter des modifications, comme toi, dans une conversation.
Ton token API
Crée-en un dans la section API tokens de ton compte. Il est affiché une seule fois, nous n'en conservons qu'une empreinte, et il t'appartient plutôt qu'à l'organisation : il ne peut pas faire plus que toi, et il cesse de fonctionner si tu pars ou si ton rôle change.
Envoie-le comme Authorization: Bearer n404_... à chaque appel. Le premier appel utile est /api/v1/me, qui répond pour quelle organisation le token agit, quel rôle il porte et lequel des deux scopes il a : une personne avec deux comptes a deux tokens et aucun autre moyen de savoir lequel est dans une variable d'environnement.
Ce qu'il y a dans la version 1
| Appel | Ce qu'il fait |
|---|---|
| GET /api/v1/me | Ce qu'est ce token, et pour quelle organisation il agit |
| GET /api/v1/monitors | Tous les monitors, du plus ancien au plus récent |
| POST /api/v1/monitors | Crée-en un, selon les mêmes règles que le formulaire respecte |
| GET /api/v1/monitors/{id} | Un monitor |
| PATCH /api/v1/monitors/{id} | Change son nom, son adresse, son intervalle ou sa config, ou mets-le en pause |
| DELETE /api/v1/monitors/{id} | Supprime-le, ainsi que son historique |
| GET /api/v1/monitors/{id}/status | Ce qu'il fait maintenant, et son uptime sur une période |
| GET /api/v1/groups | Chaque groupe, avec combien de monitors il contient |
| POST /api/v1/groups | Crée-en un ; un nom existant renvoie le groupe qui l'a |
| GET /api/v1/groups/{id} | Un groupe |
| PATCH /api/v1/groups/{id} | Renomme-le ou change sa description |
| DELETE /api/v1/groups/{id} | Supprime-le. Ses monitors restent, sans groupe |
| GET /api/v1/incidents | Pannes, les plus récentes d'abord, filtrées par état, monitor ou période |
| GET /api/v1/incidents/{id} | Un incident, avec les probes qui l'ont vu et confirmé |
| GET /api/v1/maintenance | Fenêtres de maintenance et ce qu'elles couvrent |
| GET /api/v1/maintenance/{id} | Une fenêtre, avec les monitors et groupes qu'elle couvre |
| POST /api/v1/maintenance | Planifie-en une, selon l'horloge de ton organisation, pour qu'un déploiement puisse ouvrir une fenêtre avant de commencer |
| DELETE /api/v1/maintenance/{id} | Supprime-la. Ce qu'elle couvrait reste couvert |
| GET /api/v1/status-pages | Chaque status page, et si elle est activée |
| GET /api/v1/status-pages/{id} | Une page, et ce qui y est publié |
| POST /api/v1/status-pages/{id}/monitors | Ajoute un monitor à la page, sous le nom que son audience doit lire |
| DELETE /api/v1/status-pages/{id}/monitors/{id} | Retire-le de cette page. Les autres pages le gardent |
| POST /api/v1/status-pages/{id}/groups | Ajoute un groupe à la page ; les monitors qu'il contient viennent aussi |
| DELETE /api/v1/status-pages/{id}/groups/{id} | Retire l'en-tête. Ses monitors restent publiés |
Chaque id dans un chemin ou un corps est l'UUID. L'écriture nécessite un token de lecture et d'écriture et un rôle autorisé à écrire.
Le document est au format OpenAPI 3.1. Il décrit chaque appel. Tu peux l'utiliser pour générer un client avec openapi-generator, oapi-codegen.
La version 1 ne fait que grandir : un champ peut être ajouté, aucun n'est supprimé ou retypé, et une deuxième version serait un deuxième chemin. Ainsi, un client généré continue de fonctionner, et le régénérer permet de récupérer les nouveautés.
Un client, si tu en veux un
Un fichier, Python 3.9 ou plus récent, sans dépendances. Télécharge-le et mets ton token dans l'environnement. Il fait tout ce que l'API fait, car chaque commande est un appel aux routes ci-dessus.
curl -O https://nomore404.com/api/nomore404.py
curl -s https://nomore404.com/api/nomore404.py.sha256 | sha256sum -c
chmod +x nomore404.py
export N404_TOKEN=n404_...
./nomore404.py monitors list
./nomore404.py monitors add --type https --target shop.example.com
./nomore404.py incidents --state open
Le token vient de N404_TOKEN ou d'un fichier nomore404.env à côté du script.
Pour un assistant
Un assistant peut lire ce compte et le modifier via le Model Context Protocol.
Une adresse, rien à installer
Colle ceci là où ton assistant demande un connecteur personnalisé. Il t'enverra ici pour te connecter et indiquer pour quelle organisation est la connexion, et c'est toute la configuration.
Il agit en ton nom : ton rôle est lu à chaque appel, donc un assistant connecté par quelqu'un qui ne peut que lire ne pourra que lire. Il lit les monitors, les pannes, l'uptime, les fenêtres de maintenance et les groupes, et il peut les ajouter et les modifier, ce qui inclut la suppression d'un monitor et de son historique. Déconnecte-le quand tu veux depuis Tokens API, où il est listé à côté d'eux.
Échecs, et longues listes
Une forme d'erreur
Le status indique la catégorie. Le corps indique quelle erreur c'était, avec un code pour bifurquer et une phrase à lire. La phrase peut être reformulée dans n'importe quelle version, donc rien ne devrait l'analyser.
{
"error": {
"code": "monitor_not_found",
"message": "Nothing here with that id."
}
}
Cursors, pas offsets
Une liste répond avec items et next_cursor. Renvoie le cursor pour obtenir la page suivante, et arrête-toi quand il est null. Les incidents arrivent pendant que tu les lis, et un offset te montrerait discrètement une ligne deux fois et ne montrerait jamais la suivante.
GET /api/v1/incidents?limit=50
GET /api/v1/incidents?limit=50&cursor=...
Limites
Un token peut faire 120 appels par minute. Chaque réponse inclut RateLimit-Remaining et RateLimit-Reset, donc un client bien conçu peut s'adapter au lieu de découvrir la limite en la dépassant. Quand le compte dépasse la limite, tu verras une réponse 429 avec Retry-After.