heyGRC Docs

Référence de l'API

API publique heyGRC : points de terminaison pour les cadres et la configuration des revues, avec les formats des requêtes et réponses.

URL de base : https://api.heygrc.com

Toutes les requêtes s'authentifient avec une clé API par organisation en tant que jeton Bearer :

Authorization: Bearer hgrc_...

Une clé appartient à une organisation heyGRC (une par installation de l'application GitHub) et possède des portées (config:read, config:write). Envoyez la clé uniquement dans l'en-tête - les clés transmises dans l'URL sont rejetées (400), afin d'éviter leur fuite dans les journaux et les référents. L'organisation sur laquelle agit une requête est toujours dérivée de la clé, donc une clé ne peut lire ou écrire que la configuration de sa propre organisation.


GET /v1/config

Renvoie la configuration actuelle de votre organisation. Portée : config:read.

200

{
  "profile": { "company": "Acme Inc", "...": "..." },
  "frameworks": ["ISO_27001", "SOC_2", "GDPR"],
  "eu_inference": false,
  "review_language": "en",
  "commitments": [
    { "area": "logging", "implementation": "never log email or full IP", "source": "Logging Policy 4.2" }
  ],
  "commitments_updated_at": "2026-08-26T22:00:00Z"
}

PUT /v1/config

Envoyez uniquement ce que vous modifiez. Chaque champ est facultatif : un champ omis conserve sa valeur actuelle, un champ présent est remplacé. Cela rend les flux de travail des agents sûrs : PUT modifiez uniquement le champ que vous souhaitez changer, sans lecture-modification-écriture de l'ensemble de la configuration. Les champs de premier niveau inconnus sont rejetés avec un code 400, donc une faute de frappe ne provoque jamais de non-opération silencieuse. Portée : config:write.

En-têtes : Content-Type: application/json ; Idempotency-Key: <string> (facultatif, enregistré pour des relances sûres).

Corps

ChampTypeRemarques
profileobject (facultatif)Contexte libre de l'entreprise. Doit être un objet JSON, ≤ 16 Ko, profondeur d'imbrication max 4, les valeurs sont des chaînes / nombres / booléens / tableaux de ceux-ci. Présent = remplacé ; omis = inchangé.
frameworksstring[] (facultatif)Les identifiants de cadre auxquels vous devez vous conformer. Chaque identifiant doit être présent dans le catalogue - les identifiants inconnus sont rejetés, non ignorés silencieusement. Présent = remplacé ; omis = inchangé.
commitmentsarray (facultatif)Vos engagements de mise en œuvre : jusqu'à 5 lignes, une par domaine (logging, access_mfa, encryption, pii_retention, subprocessors) ; chaque ligne est { "area", "implementation" (1-300 caractères, une seule ligne), "source"? (1-120 caractères, une seule ligne) }. Présent = remplacé (envoyez [] pour effacer la carte) ; omis = inchangé ; null est rejeté.
eu_inferenceboolean (facultatif)Persistant : omis = valeur actuelle conservée ; booléen = défini. Les non-booléens sont rejetés.
review_languagestring (facultatif)Persistant : omis = inchangé ; l'un des en, de, es, fr, it, nl, pl.

200

{ "ok": true, "commitments": [ { "area": "logging", "implementation": "never log email or full IP" } ] }

Seuls les champs que vous avez envoyés sont renvoyés. Un code 200 n'est renvoyé qu'après que le changement et son enregistrement d'audit sont validés ensemble, donc une écriture réussie est toujours traçable.

Erreurs

Format JSON stable pour chaque erreur :

{ "error": { "code": "unknown_frameworks", "message": "unknown framework ids: FOO", "unknown": ["FOO"] } }
| 400 | `invalid_request` | Champ(s) de premier niveau inconnu(s), ou un corps de requête sans aucun des champs connus (mise à jour vide). |
| 422 | `invalid_commitments` | `commitments` n'est pas un tableau de lignes valides (zone inconnue ou en double, texte trop long, caractères de contrôle). `null` est un 400 : utilisez `[]` pour effacer. |
StatutcodeSignification
400invalid_requestCorps non JSON, forme du corps incorrecte, ou une clé a été passée dans l'URL.
401unauthorizedClé manquante, mal formée, invalide, expirée ou révoquée.
403forbiddenLa clé ne possède pas la portée requise (config:read / config:write).
422invalid_profileprofile n'est pas un objet, est trop volumineux ou trop profondément imbriqué.
422unknown_frameworksUn ou plusieurs identifiants de cadre ne figurent pas dans le catalogue (voir unknown).
429rate_limitedTrop de requêtes ; ralentissez.
405method_not_allowedMéthode HTTP non prise en charge sur ce point de terminaison.
500internalErreur serveur inattendue ; réessayez avec un backoff.

Limites de débit

Des plafonds de requêtes par clé et par IP protègent le service. Restez en dessous d'environ 1 requête/seconde et vous ne verrez jamais de 429. La configuration est un plan de contrôle - vous la définissez occasionnellement, pas dans une boucle intensive.


GET /v1/frameworks

Le catalogue complet et lisible par machine (sans authentification - pointez votre agent ici pour découvrir les identifiants valides) :

{ "frameworks": [ { "id": "ISO_27001", "name": "ISO 27001:2022", "region": "International" }, … ] }

Catalogue des cadres

Le catalogue de cadres de heyGRC est retourné par GET /v1/frameworks (le nombre augmente au fil du temps ; ne le codez pas en dur). Passez l'identifiant canonique dans frameworks. Les identifiants les plus courants :

ISO_27001, ISO_42001, ISO_27701, ISO_22301, ISO_9001, SOC_2, GDPR, UK_GDPR, HIPAA, CCPA, EU_AI_ACT, NIST_CSF, NIST_800_53, NIST_800_171, NIST_AI_RMF, DORA, TISAX, CMMC, FEDRAMP, CYFUN, AU_ESSENTIAL_EIGHT, et NIS 2 sous NIS_2 ainsi que les variantes par pays (NIS_2_DE, NIS_2_FR, NIS_2_IT, …).

Une requête PUT avec un identifiant en dehors du catalogue est rejetée avec 422 unknown_frameworks et les identifiants problématiques sont renvoyés, afin que votre agent puisse se corriger automatiquement.

On this page