Aller au contenu
NNextHop
API publique v1

Une API ouverte pour l'observatoire de la souverainete.

Lecture seule, sans authentification, format JSON ou CSV. Specification OpenAPI 3.0 disponible pour generer un client ou alimenter Postman.

Authentification

Aucune

Les endpoints v1 sont ouverts. Pas de cle API a fournir. Identification de l'appelant par IP source.

Limite de debit

60 requetes / minute / IP

Au-dela, le serveur repond 429. Pour un volume superieur, contactez contact@nexthop.fr.

Specification

OpenAPI 3.0 YAML

Telecharger openapi.yaml ->

Endpoints

Six routes, lecture seule

Toutes les reponses JSON ont la forme { data, meta }. Les exports CSV/JSON utilisent un header Content-Disposition: attachment avec un nom de fichier date.

GET/api/v1/providers

Liste de tous les fournisseurs, colonnes publiques, trie par nom.

Exemple curl

curl -s https://www.nexthop.fr/api/v1/providers

Reponse exemple

{
  "data": [
    {
      "id": 17,
      "name": "[A COMPLETER avec donnees reelles a la prochaine sync]",
      "slug": "[A COMPLETER]",
      "country_code": "[A COMPLETER]",
      "country": "[A COMPLETER]",
      "headquarters": "[A COMPLETER]",
      "employees": null,
      "founded_year": null,
      "ownership_holding": null,
      "website_url": "[A COMPLETER]",
      "sovereignty_score": 87,
      "sovereignty_status": "eu",
      "last_updated": "2026-05-23T08:12:00.000Z",
      "is_active": 1
    }
  ],
  "meta": {
    "count": 30,
    "generated_at": "2026-05-23T09:00:00.000Z"
  }
}
GET/api/v1/providers/{slug}

Detail d'un fournisseur, avec sous-objet criteria (6 criteres de scoring).

Exemple curl

curl -s https://www.nexthop.fr/api/v1/providers/ovh

Reponse exemple

{
  "data": {
    "id": 17,
    "name": "[A COMPLETER]",
    "slug": "ovh",
    "country_code": "FR",
    "country": "France",
    "sovereignty_score": 87,
    "sovereignty_status": "eu",
    "criteria": {
      "juridique":      { "score": 20, "max": 20, "level": null, "label": null },
      "immunite":       { "score": 18, "max": 20, "level": null, "label": null },
      "technologie":    { "score": 12, "max": 15, "level": null, "label": null },
      "donnees":        { "score": 18, "max": 20, "level": null, "label": null },
      "certifications": { "score": 12, "max": 15, "level": null, "label": null },
      "ouverture":      { "score": 7,  "max": 10, "level": null, "label": null }
    },
    "last_updated": "2026-05-23T08:12:00.000Z"
  },
  "meta": { "generated_at": "2026-05-23T09:00:00.000Z" }
}
GET/api/v1/scores

Scores courants. Parametres : ?sort=score|name &order=asc|desc.

Exemple curl

curl -s 'https://www.nexthop.fr/api/v1/scores?sort=score&order=desc'

Reponse exemple

{
  "data": [
    {
      "provider_id": 17,
      "provider_name": "[A COMPLETER]",
      "sovereignty_score": 87,
      "last_changed_at": "2026-05-20T14:32:11.000Z"
    }
  ],
  "meta": {
    "count": 30,
    "generated_at": "2026-05-23T09:00:00.000Z",
    "sort": "score",
    "order": "desc"
  }
}
GET/api/v1/export/providers.csv

Telechargement CSV (UTF-8, header en premiere ligne).

Exemple curl

curl -OJ https://www.nexthop.fr/api/v1/export/providers.csv

Reponse exemple

id,name,slug,country_code,country,headquarters,employees,founded_year,ownership_holding,website_url,sovereignty_score,sovereignty_status,last_updated,is_active
17,[A COMPLETER],ovh,FR,France,Roubaix,,1999,,https://www.ovhcloud.com,87,eu,2026-05-23T08:12:00.000Z,1
GET/api/v1/export/providers.json

Telechargement JSON (meme payload que /providers, header Content-Disposition).

Exemple curl

curl -OJ https://www.nexthop.fr/api/v1/export/providers.json

Reponse exemple

(meme schema que /providers)
GET/api/v1/export/scores.csv

Telechargement CSV scores actuels.

Exemple curl

curl -OJ https://www.nexthop.fr/api/v1/export/scores.csv

Reponse exemple

provider_id,provider_name,sovereignty_score,last_changed_at
17,[A COMPLETER],87,2026-05-20T14:32:11.000Z

Codes d'erreur

Format unifie

Une erreur reponds toujours avec le meme schema :

{
  "success": false,
  "error": {
    "code": "NOT_FOUND",
    "message": "Provider 'foo' not found"
  }
}
400 BAD_REQUESTParametre invalide (slug vide, format de tri non reconnu).
404 NOT_FOUNDProvider slug introuvable.
429 RATE_LIMITEDPlus de 60 requetes par minute depuis votre IP.
500 INTERNAL_ERRORErreur serveur. Notre monitoring est notifie automatiquement.

Webhooks

BETA

Notifications signees HMAC sur evenements

Recevez une requete HTTP POST sur votre endpoint des qu'un score evolue, qu'un fournisseur est ajoute ou qu'un snapshot est publie. Chaque livraison embarque une signature dans l'entete X-NextHop-Signature.

POST/api/v1/webhooks

Cree une souscription. Body JSON : { url, event_type, contact_email }. La reponse contient un secret 32-bytes (uniquement a la creation).

Exemple curl

curl -X POST https://www.nexthop.fr/api/v1/webhooks \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://your-server.example.com/hook",
    "event_type": "score.changed",
    "contact_email": "you@example.com"
  }'
GET/api/v1/webhooks/events

Liste les types d'evenements supportes avec un payload exemple pour chacun.

Exemple de payload (event score.changed)

{
  "event": "score.changed",
  "delivered_at": "2026-05-23T12:30:00.000Z",
  "data": {
    "provider_id": 17,
    "provider_slug": "ovh",
    "provider_name": "OVHcloud",
    "previous_score": 84,
    "new_score": 87,
    "changed_at": "2026-05-23T12:29:11.000Z"
  }
}

Verification de signature

X-NextHop-Signature: sha256=<HMAC-SHA256 du body avec le secret>

# Node.js
const expected = 'sha256=' + crypto
  .createHmac('sha256', WEBHOOK_SECRET)
  .update(rawBody)
  .digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(req.headers['x-nexthop-signature']))) {
  return res.status(401).end();
}

Beta : la livraison effective sera activee une fois le worker d'envoi en production. L'API de souscription est deja disponible pour preparer l'integration cote consommateur.