Référence de l’API

Pilotez NorminUp depuis vos propres outils : services, incidents, maintenances, pages de statut, équipe.

Adresse de basehttps://api.norminup.com

Pour commencer

Authentification

L’API est comprise dans l’offre Pro. Créez une clé dans la page Développeurs du tableau de bord, puis envoyez-la dans l’en-tête Authorization de chaque requête. Une clé agit au nom de votre organisation : gardez-la côté serveur, jamais dans du code visible.

Réponses

Toutes les réponses sont en JSON. Une liste renvoie count et data, un élément data, une création répond 201 avec l’identifiant créé.

Limite

100 requêtes par minute et par adresse. Au-delà, la réponse est 429.

Guide de l’API dans la documentation
Authentification
curl https://api.norminup.com/api/v2/services \
  -H "Authorization: Bearer VOTRE_CLE"

Erreurs

400
Requête invalide : un champ error, ou errors avec le détail champ par champ.
401
Clé absente ou invalide.
403
L’offre ne comprend pas l’API, ou une limite de l’offre est atteinte.
404
L’élément n’existe pas, ou pas dans votre organisation.
429
Trop de requêtes.

Compte et consommation

GET/api/v2/usage

Votre offre et ce que vous consommez, avec les limites.

Requête
curl -X GET https://api.norminup.com/api/v2/usage \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "plan": "PRO",
  "usage": {
    "services": { "current": 12, "limit": 50, "remaining": 38 },
    "team_members": { "current": 3, "limit": 10, … },
    …
  }
}
GET/api/v2/stats

Les chiffres de l’organisation : services par état, incidents.

Requête
curl -X GET https://api.norminup.com/api/v2/stats \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "data": { … }
}
GET/api/v2/billing/portal

Une adresse vers le portail de facturation Stripe, pour gérer l’abonnement.

Requête
curl -X GET https://api.norminup.com/api/v2/billing/portal \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "url": "https://billing.stripe.com/p/session/…"
}
GET/api/v2/organization

Les informations de l’organisation.

Requête
curl -X GET https://api.norminup.com/api/v2/organization \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "data": {
    "id": 1,
    "name": "Boulangerie Martin",
    "slug": "boulangerie-martin",
    "plan": "PRO",
    "created_at": "2026-09-14T08:12:00.000Z",
    "custom_domain": "status.boulangerie-martin.fr",
    "domain_verified": 1
  }
}
PUT/api/v2/organization

Renommer l’organisation.

Requête
curl -X PUT https://api.norminup.com/api/v2/organization \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Boulangerie Martin"
  }'
Réponse200
{
  "message": "Organization updated"
}
GET/api/v2/organization/audit-logs

Le journal d’activité, page par page.

Paramètres de l’adresse

limit = 50
Nombre d’entrées, 200 au plus
page = 1
Page à lire
user_id
Actions d’un membre
action
Type d’action
entity_type
Type d’élément concerné
Requête
curl -X GET https://api.norminup.com/api/v2/organization/audit-logs \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "data": [ { … } ],
  …
}

Services

GET/api/v2/services

Tous vos services, avec leur état.

Requête
curl -X GET https://api.norminup.com/api/v2/services \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "count": 1,
  "data": [
    {
      "id": 42,
      "name": "Site de la boutique",
      "description": null,
      "type": "http",
      "status": "operational",
      "is_maintenance": 0,
      "group_name": "Site",
      "created_at": "2026-10-01T09:00:00.000Z",
      "updated_at": "2026-10-17T21:04:00.000Z"
    }
  ]
}
GET/api/v2/services/:id

Un service.

Requête
curl -X GET https://api.norminup.com/api/v2/services/:id \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "data": { … }
}
POST/api/v2/services

Créer un service. Types acceptés : web, api, tcp, udp, icmp (ou ping), dns, ssl, domain, heartbeat, database, redis, docker, websocket, smtp, imap, pop3, grpc, payment_gateway, discord_shards et other ; http reste accepté comme synonyme de web. url est obligatoire pour web, api et http.

Requête
curl -X POST https://api.norminup.com/api/v2/services \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Site de la boutique",
    "type": "web",
    "url": "https://www.example.com"
  }'
Réponse201
{
  "message": "Service created",
  "data": { "id": 42 }
}
PUT/api/v2/services/:id

Modifier un service, avec les mêmes champs qu’à la création.

Requête
curl -X PUT https://api.norminup.com/api/v2/services/:id \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Site de la boutique",
    "type": "web",
    "url": "https://www.example.com"
  }'
Réponse200
{
  "message": "Service updated"
}
DELETE/api/v2/services/:id

Supprimer un service.

Requête
curl -X DELETE https://api.norminup.com/api/v2/services/:id \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "message": "Service deleted"
}
GET/api/v2/services/:id/metrics

Les mesures d’un service sur une période : temps de réponse, disponibilité.

Paramètres de l’adresse

range
Période à couvrir
Requête
curl -X GET https://api.norminup.com/api/v2/services/:id/metrics \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "data": { … }
}
GET/api/v2/services/:id/uptime-history

L’historique de disponibilité, jour par jour.

Requête
curl -X GET https://api.norminup.com/api/v2/services/:id/uptime-history \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "data": { … }
}
GET/api/v2/services/:id/logs

Les dernières vérifications du service.

Requête
curl -X GET https://api.norminup.com/api/v2/services/:id/logs \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "count": 2,
  "data": [ { … }, { … } ]
}
POST/api/v2/services/test

Tester une adresse sans créer de service, avec les mêmes champs qu’à la création. Les adresses privées et internes sont refusées comme pour un vrai service.

Requête
curl -X POST https://api.norminup.com/api/v2/services/test \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "web",
    "url": "https://www.example.com"
  }'
Réponse201
{
  "data": {
    "status": "operational",
    "responseTime": 182,
    …
  }
}
GET/api/v2/services/:id/shards

L’état de chaque shard d’un bot Discord (type discord_shards). data vaut null tant que le bot n’a rien envoyé.

Requête
curl -X GET https://api.norminup.com/api/v2/services/:id/shards \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "data": {
    "status": "operational",
    "total": 2,
    "ready": 2,
    "starting": 0,
    "missingCount": 0,
    "shards": [
      { "id": 0, "state": "ready", "status": "ready", "ping_ms": 41, "guilds": 812, "last_seen": "2026-10-17T21:04:00.000Z" },
      …
    ]
  }
}
GET/api/v2/services/:id/heartbeat-token

Le jeton d’un service heartbeat ou discord_shards. Une tâche planifiée signale qu’elle tourne en appelant /api/heartbeat/t/<jeton> ; un bot à shards l’envoie à /api/heartbeat/shards.

Requête
curl -X GET https://api.norminup.com/api/v2/services/:id/heartbeat-token \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "data": { "token": "9f2c…" }
}
GET/api/v2/services/:id/maintenance

Les maintenances d’un service.

Requête
curl -X GET https://api.norminup.com/api/v2/services/:id/maintenance \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "count": 2,
  "data": [ { … }, { … } ]
}
POST/api/v2/services/:id/maintenance

Mettre un service en maintenance sur une période. Dates au format ISO 8601.

Requête
curl -X POST https://api.norminup.com/api/v2/services/:id/maintenance \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Mise à jour de la base",
    "description": "Coupure de quelques minutes.",
    "start_time": "2026-11-02T03:00:00Z",
    "end_time": "2026-11-02T04:00:00Z"
  }'
Réponse201
{
  "message": "Maintenance scheduled",
  "data": { "id": 8 }
}
DELETE/api/v2/services/:id/maintenance/:maintenanceId

Annuler la maintenance d’un service.

Requête
curl -X DELETE https://api.norminup.com/api/v2/services/:id/maintenance/:maintenanceId \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "message": "Maintenance deleted"
}
GET/api/v2/service-groups

Les groupes de services.

Requête
curl -X GET https://api.norminup.com/api/v2/service-groups \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "count": 2,
  "data": [ { … }, { … } ]
}
POST/api/v2/service-groups

Créer un groupe de services.

Requête
curl -X POST https://api.norminup.com/api/v2/service-groups \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Site"
  }'
Réponse201
{
  "message": "Service group created",
  "data": { "id": 4, "name": "Site" }
}
PUT/api/v2/service-groups/:id

Renommer un groupe.

Requête
curl -X PUT https://api.norminup.com/api/v2/service-groups/:id \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Boutique en ligne"
  }'
Réponse200
{
  "message": "Service group updated"
}
DELETE/api/v2/service-groups/:id

Supprimer un groupe. Ses services ne sont pas supprimés.

Requête
curl -X DELETE https://api.norminup.com/api/v2/service-groups/:id \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "message": "Service group deleted"
}

Incidents

GET/api/v2/incidents

Les incidents, les plus récents d’abord.

Paramètres de l’adresse

status
Ne garder qu’une étape
limit = 20
Nombre d’incidents
Requête
curl -X GET https://api.norminup.com/api/v2/incidents \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "count": 2,
  "data": [ { … }, { … } ]
}
GET/api/v2/incidents/:id

Un incident et les services concernés.

Requête
curl -X GET https://api.norminup.com/api/v2/incidents/:id \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "data": { … }
}
POST/api/v2/incidents

Créer un incident.

Champs du corps

service_id
Service concerné
title
Titre affiché sur la page de statut
status
investigating, identified, monitoring ou resolved
description
Premier message du suivi, facultatif
impact
none, minor, major ou critical ; none par défaut
Requête
curl -X POST https://api.norminup.com/api/v2/incidents \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "service_id": 42,
    "title": "Commandes en ligne indisponibles",
    "status": "investigating",
    "description": "Le site ne prend plus les commandes, on regarde.",
    "impact": "major"
  }'
Réponse201
{
  "message": "Incident created",
  "id": 12
}
PUT/api/v2/incidents/:id

Modifier le titre ou l’étape d’un incident ; description ajoute un message au suivi. L’impact se fixe à la création.

Requête
curl -X PUT https://api.norminup.com/api/v2/incidents/:id \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Commandes en ligne indisponibles",
    "status": "identified",
    "description": "Cause trouvée, correctif en cours."
  }'
Réponse200
{
  "message": "Incident updated"
}
POST/api/v2/incidents/:id/updates

Ajouter une mise à jour visible sur la page de statut, et changer d’étape si besoin.

Requête
curl -X POST https://api.norminup.com/api/v2/incidents/:id/updates \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "message": "La cause est trouvée, la correction est en cours.",
    "status": "identified"
  }'
Réponse201
{
  "message": "Update posted",
  "status": "identified"
}
DELETE/api/v2/incidents/:id

Supprimer un incident.

Requête
curl -X DELETE https://api.norminup.com/api/v2/incidents/:id \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "message": "Incident deleted"
}

Maintenances

GET/api/v2/maintenance

Les maintenances planifiées.

Requête
curl -X GET https://api.norminup.com/api/v2/maintenance \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "count": 2,
  "data": [ { … }, { … } ]
}
GET/api/v2/maintenance/:id

Une maintenance.

Requête
curl -X GET https://api.norminup.com/api/v2/maintenance/:id \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "data": { … }
}
POST/api/v2/maintenance

Planifier une maintenance. Dates au format ISO 8601.

Requête
curl -X POST https://api.norminup.com/api/v2/maintenance \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Mise à jour du serveur",
    "start_time": "2026-11-02T03:00:00Z",
    "end_time": "2026-11-02T04:00:00Z"
  }'
Réponse201
{
  "message": "Maintenance scheduled",
  "id": 5
}
PUT/api/v2/maintenance/:id

Modifier une maintenance, avec les mêmes champs qu’à la création.

Requête
curl -X PUT https://api.norminup.com/api/v2/maintenance/:id \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Mise à jour du serveur",
    "start_time": "2026-11-02T03:00:00Z",
    "end_time": "2026-11-02T05:00:00Z"
  }'
Réponse200
{
  "message": "Maintenance updated"
}
DELETE/api/v2/maintenance/:id

Supprimer une maintenance.

Requête
curl -X DELETE https://api.norminup.com/api/v2/maintenance/:id \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "message": "Maintenance deleted"
}

Pages de statut

GET/api/v2/pages

Vos pages de statut.

Requête
curl -X GET https://api.norminup.com/api/v2/pages \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "count": 2,
  "data": [ { … }, { … } ]
}
GET/api/v2/pages/:id

Une page de statut.

Requête
curl -X GET https://api.norminup.com/api/v2/pages/:id \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "data": { … }
}
POST/api/v2/pages

Créer une page. L’adresse courte (slug) ne contient que des minuscules, des chiffres et des tirets.

Requête
curl -X POST https://api.norminup.com/api/v2/pages \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Boulangerie Martin",
    "slug": "boulangerie-martin",
    "title": "État de nos services"
  }'
Réponse201
{
  "message": "Status page created",
  "id": 3,
  "slug": "boulangerie-martin"
}
PUT/api/v2/pages/:id

Modifier une page. Champs possibles : name, slug, title, description, logo_url, domain, config.

Requête
curl -X PUT https://api.norminup.com/api/v2/pages/:id \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Boulangerie Martin",
    "slug": "boulangerie-martin",
    "description": "Commandes, site et caisse."
  }'
Réponse200
{
  "message": "Page updated"
}
DELETE/api/v2/pages/:id

Supprimer une page.

Requête
curl -X DELETE https://api.norminup.com/api/v2/pages/:id \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "message": "Page deleted"
}

Modèles d’incident

GET/api/v2/templates

Vos modèles d’incident.

Requête
curl -X GET https://api.norminup.com/api/v2/templates \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "count": 2,
  "data": [ { … }, { … } ]
}
GET/api/v2/templates/:id

Un modèle.

Requête
curl -X GET https://api.norminup.com/api/v2/templates/:id \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "data": { … }
}
POST/api/v2/templates

Créer un modèle.

Requête
curl -X POST https://api.norminup.com/api/v2/templates \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Panne du site",
    "title": "Site momentanément indisponible"
  }'
Réponse201
{
  "message": "Template created",
  "id": 7
}
PUT/api/v2/templates/:id

Modifier un modèle.

Requête
curl -X PUT https://api.norminup.com/api/v2/templates/:id \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Panne du site",
    "title": "Site indisponible, nous enquêtons"
  }'
Réponse200
{
  "message": "Template updated"
}
DELETE/api/v2/templates/:id

Supprimer un modèle.

Requête
curl -X DELETE https://api.norminup.com/api/v2/templates/:id \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "message": "Template deleted"
}

Webhooks

GET/api/v2/webhooks

Vos webhooks.

Requête
curl -X GET https://api.norminup.com/api/v2/webhooks \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "count": 2,
  "data": [ { … }, { … } ]
}
POST/api/v2/webhooks

Créer un webhook. « * » reçoit tous les événements.

Requête
curl -X POST https://api.norminup.com/api/v2/webhooks \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/norminup",
    "events": ["*"]
  }'
Réponse201
{
  "id": 9,
  "name": null,
  "url": "https://example.com/norminup",
  "events": "[\"*\"]",
  "is_active": true
}
PUT/api/v2/webhooks/:id

Modifier un webhook, avec les mêmes champs qu’à la création.

Requête
curl -X PUT https://api.norminup.com/api/v2/webhooks/:id \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/norminup",
    "events": ["service.down"]
  }'
Réponse200
{
  "message": "Webhook updated"
}
DELETE/api/v2/webhooks/:id

Supprimer un webhook.

Requête
curl -X DELETE https://api.norminup.com/api/v2/webhooks/:id \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "message": "Webhook deleted"
}
GET/api/v2/webhooks/:id/deliveries

Les 50 derniers envois, avec la réponse reçue.

Requête
curl -X GET https://api.norminup.com/api/v2/webhooks/:id/deliveries \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "count": 2,
  "data": [ { … }, { … } ]
}
POST/api/v2/webhooks/:id/test

Envoyer un événement de test au webhook. L’envoi part en file d’attente : son résultat apparaît dans les envois.

Requête
curl -X POST https://api.norminup.com/api/v2/webhooks/:id/test \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse201
{
  "data": {
    "success": true,
    "message": "Test event queued"
  }
}
POST/api/v2/webhooks/:id/pause

Mettre un webhook en pause : plus aucun envoi jusqu’à sa reprise.

Requête
curl -X POST https://api.norminup.com/api/v2/webhooks/:id/pause \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse201
{
  "message": "Webhook paused",
  "data": { "is_active": false }
}
POST/api/v2/webhooks/:id/resume

Reprendre les envois d’un webhook en pause.

Requête
curl -X POST https://api.norminup.com/api/v2/webhooks/:id/resume \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse201
{
  "message": "Webhook resumed",
  "data": { "is_active": true }
}

Abonnés

GET/api/v2/subscribers

Les abonnés de vos pages de statut, page par page.

Paramètres de l’adresse

page = 1
Page à lire
limit = 10
Abonnés par page
Requête
curl -X GET https://api.norminup.com/api/v2/subscribers \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "count": 10,
  "data": [ { … }, … ],
  "pagination": {
    "total": 48,
    "page": 1,
    "limit": 10,
    "totalPages": 5
  }
}
POST/api/v2/subscribers

Abonner une adresse à des services. Un e-mail de confirmation lui est envoyé : l’abonné reste en attente, ne reçoit rien et ne compte pas dans le quota tant qu’il n’a pas cliqué. Les services masqués de la page publique sont ignorés.

Champs du corps

email
Adresse à abonner
service_ids
Services concernés, de 1 à 20
language
fr ou en, langue de l’e-mail ; en par défaut
Requête
curl -X POST https://api.norminup.com/api/v2/subscribers \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "client@example.com",
    "service_ids": [42, 43],
    "language": "fr"
  }'
Réponse201
{
  "message": "Confirmation email sent",
  "data": {
    "email": "client@example.com",
    "status": "pending_confirmation"
  }
}
POST/api/v2/subscribers/import

Importer des abonnés depuis un fichier CSV envoyé en multipart/form-data, champ file, 2 Mo au plus. Colonnes : email, et service_id pour un service précis. Les lignes au-delà du quota de l’offre, en double ou invalides sont listées dans errors.

Requête
curl -X POST https://api.norminup.com/api/v2/subscribers/import \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse201
{
  "message": "Subscribers imported",
  "data": {
    "message": "Import completed",
    "successCount": 48,
    "errorCount": 2,
    "errors": [ { "row": { … }, "error": "Already subscribed" }, … ]
  }
}
DELETE/api/v2/subscribers/:id

Retirer un abonné.

Requête
curl -X DELETE https://api.norminup.com/api/v2/subscribers/:id \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "message": "Subscriber removed"
}

Équipe

GET/api/v2/team/members

Les membres de l’organisation.

Requête
curl -X GET https://api.norminup.com/api/v2/team/members \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "count": 2,
  "data": [ { … }, { … } ]
}
DELETE/api/v2/team/members/:userId

Retirer un membre.

Requête
curl -X DELETE https://api.norminup.com/api/v2/team/members/:userId \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "message": "Team member removed successfully"
}
GET/api/v2/team/invitations

Les invitations en attente.

Requête
curl -X GET https://api.norminup.com/api/v2/team/invitations \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "count": 2,
  "data": [ { … }, { … } ]
}
POST/api/v2/team/invitations

Inviter quelqu’un par e-mail. Rôles acceptés : admin, editor ou viewer.

Requête
curl -X POST https://api.norminup.com/api/v2/team/invitations \
  -H "Authorization: Bearer VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "collegue@example.com",
    "role": "admin"
  }'
Réponse201
{
  "message": "Invitation created",
  "data": { … }
}
DELETE/api/v2/team/invitations/:id

Annuler une invitation.

Requête
curl -X DELETE https://api.norminup.com/api/v2/team/invitations/:id \
  -H "Authorization: Bearer VOTRE_CLE"
Réponse200
{
  "message": "Invitation revoked"
}

API v1

Il ne reste dans la v1 qu’un point d’accès, gardé pour les intégrations existantes. Utilisez la v2 pour tout nouveau code.

POST/api/v1/incidents