Riferimento API
API pubblica heyGRC: endpoint per framework e configurazione delle revisioni, con forme di richiesta e risposta.
URL di base: https://api.heygrc.com
Tutte le richieste si autenticano con una chiave API per organizzazione come token Bearer:
Authorization: Bearer hgrc_...Una chiave appartiene a una singola organizzazione heyGRC (una per installazione della GitHub App) e possiede ambiti (config:read, config:write). Invia la chiave solo nell'intestazione - le chiavi passate nell'URL vengono rifiutate (400), per evitare che vengano trapelate nei log e nei referrer. L'organizzazione su cui agisce una richiesta è sempre derivata dalla chiave, quindi una chiave può leggere o scrivere solo la configurazione della propria organizzazione.
GET /v1/config
Restituisce la configurazione corrente della tua organizzazione. Ambito: 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
Invia solo ciò che vuoi modificare. Ogni campo è opzionale: un campo omesso mantiene il suo valore attuale, un campo presente viene sostituito. Questo rende i flussi di lavoro degli agenti sicuri: PUT solo il campo che vuoi cambiare, senza leggere-modificare-scrivere l'intera configurazione. I campi di primo livello sconosciuti vengono rifiutati con 400, quindi un errore di battitura non causa mai un no-op silenzioso. Ambito: config:write.
Intestazioni: Content-Type: application/json; opzionale Idempotency-Key: <string> (registrato per i tentativi sicuri).
Body
| Campo | Tipo | Note |
|---|---|---|
profile | object (opzionale) | Contesto aziendale libero. Deve essere un oggetto JSON, ≤ 16 KB, profondità massima di annidamento 4, i valori sono stringhe / numeri / booleani / array di questi. Presente = sostituito; omesso = invariato. |
frameworks | string[] (opzionale) | Gli ID dei framework ai quali devi conformarti. Ogni ID deve essere nel catalogo - gli ID sconosciuti vengono rifiutati, non scartati silenziosamente. Presente = sostituito; omesso = invariato. |
commitments | array (opzionale) | I tuoi impegni di implementazione: fino a 5 righe, una per area (logging, access_mfa, encryption, pii_retention, subprocessors); ogni riga è { "area", "implementation" (1-300 caratteri, una sola riga), "source"? (1-120 caratteri, una sola riga) }. Presente = sostituito (invia [] per cancellare la mappa); omesso = invariato; null viene rifiutato. |
eu_inference | boolean (opzionale) | Persistente: omesso = valore attuale mantenuto; boolean = impostato. I non booleani vengono rifiutati. |
review_language | string (opzionale) | Persistente: omesso = invariato; uno tra en, de, es, fr, it, nl, pl. |
200
{ "ok": true, "commitments": [ { "area": "logging", "implementation": "never log email or full IP" } ] }Vengono restituiti solo i campi che hai inviato. Un 200 viene restituito solo dopo che la modifica e il suo record di audit sono stati registrati insieme, quindi una scrittura andata a buon fine è sempre tracciabile.
Errori
Forma JSON stabile per ogni errore:
{ "error": { "code": "unknown_frameworks", "message": "id framework sconosciuti: FOO", "unknown": ["FOO"] } }
| 400 | `invalid_request` | Campo/i di primo livello sconosciuti, oppure un corpo con nessuno dei campi noti (aggiornamento vuoto). |
| 422 | `invalid_commitments` | `commitments` non è un array di righe valide (area sconosciuta o duplicata, testo troppo lungo, caratteri di controllo). `null` è un 400: usa `[]` per cancellare. || Stato | code | Significato |
|---|---|---|
| 400 | invalid_request | Corpo non JSON, forma del corpo errata, o una chiave è stata passata nell'URL. |
| 401 | unauthorized | Chiave mancante, malformata, non valida, scaduta o revocata. |
| 403 | forbidden | La chiave non possiede l'ambito richiesto (config:read / config:write). |
| 422 | invalid_profile | profile non è un oggetto, è troppo grande o troppo profondamente nidificato. |
| 422 | unknown_frameworks | Uno o più id di framework non sono presenti nel catalogo (vedi unknown). |
| 429 | rate_limited | Troppe richieste; rallentare. |
| 405 | method_not_allowed | Metodo HTTP non supportato su questo endpoint. |
| 500 | internal | Errore imprevisto del server; riprovare con backoff è sicuro. |
Limiti di frequenza
I limiti di richieste per chiave e per IP proteggono il servizio. Rimani sotto ~1 richiesta/secondo e non riceverai mai un 429. La configurazione è un piano di controllo - la imposti occasionalmente, non in un ciclo continuo.
GET /v1/frameworks
Il catalogo completo leggibile dalla macchina (nessuna autenticazione - punta qui il tuo agente per scoprire gli id validi):
{ "frameworks": [ { "id": "ISO_27001", "name": "ISO 27001:2022", "region": "International" }, … ] }Catalogo dei framework
Il catalogo dei framework di heyGRC viene restituito da GET /v1/frameworks (il conteggio cresce nel tempo; non codificare in modo rigido). Passa l'id canonico in frameworks. Gli id più comuni:
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, e NIS 2 come NIS_2 più varianti per paese (NIS_2_DE, NIS_2_FR, NIS_2_IT, …).
Una PUT con un id al di fuori del catalogo viene rifiutata con 422 unknown_frameworks e gli id non validi vengono restituiti, in modo che il tuo agente possa autocorreggersi.
Pricing and plans
heyGRC Free (10 private pull requests a month), Starter, Pro, and Business plans, counted in PR reviews: one per pull request per billing period, re-pushes do not count again. First time over: 25% more free, once. Then extras at $0.49 per PR review if an owner turned them on, or a pause. Public repos free, 500 reviews per org per month.
Permessi dell'app GitHub
Cosa può leggere e scrivere l'app GitHub heyGRC e cosa non fa mai al tuo codice sorgente.