Referência da API
API pública heyGRC: endpoints para frameworks e configuração de revisão, com formatos de requisição e resposta.
URL Base: https://api.heygrc.com
Todas as requisições autenticam com uma chave de API por organização como um token Bearer:
Authorization: Bearer hgrc_...Uma chave pertence a uma organização heyGRC (uma por instalação do GitHub App) e carrega escopos (config:read, config:write). Envie a chave apenas no cabeçalho - chaves passadas na URL são rejeitadas (400), para evitar vazamento em logs e referrers. A organização em que uma requisição atua é sempre derivada da chave, portanto, uma chave só pode ler ou escrever a configuração de sua própria organização.
GET /v1/config
Retorna a configuração atual da sua organização. Escopo: 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
Envie apenas o que deseja alterar. Todos os campos são opcionais: um campo omitido mantém seu valor atual, um campo presente é substituído. Isso torna os fluxos de trabalho do agente seguros: PUT apenas o campo que deseja alterar, sem leitura-modificação-gravação de toda a configuração. Campos de nível superior desconhecidos são rejeitados com 400, então um erro de digitação nunca resultará em uma operação silenciosa sem efeito. Escopo: config:write.
Headers: Content-Type: application/json; Idempotency-Key: <string> opcional (registrado para tentativas seguras).
Corpo
| Campo | Tipo | Notas |
|---|---|---|
profile | objeto (opcional) | Contexto livre da empresa. Deve ser um objeto JSON, ≤ 16 KB, profundidade máxima de aninhamento 4, valores são strings / números / booleanos / arrays desses tipos. Presente = substituído; omitido = inalterado. |
frameworks | string[] (opcional) | Os IDs de frameworks aos quais você deve cumprir. Cada ID deve estar no catálogo - IDs desconhecidos são rejeitados, não descartados silenciosamente. Presente = substituído; omitido = inalterado. |
commitments | array (opcional) | Suas compromissos de implementação: até 5 linhas, uma por área (logging, access_mfa, encryption, pii_retention, subprocessors); cada linha é { "area", "implementation" (1-300 chars, única linha), "source"? (1-120 chars, única linha) }. Presente = substituído (envie [] para limpar o mapa); omitido = inalterado; null é rejeitado. |
eu_inference | boolean (opcional) | Persistente: omitido = valor atual mantido; booleano = definido. Não booleanos rejeitados. |
review_language | string (opcional) | Persistente: omitido = inalterado; um dos en, de, es, fr, it, nl, pl. |
200
{ "ok": true, "commitments": [ { "area": "logging", "implementation": "never log email or full IP" } ] }Apenas os campos enviados são retornados. Um 200 é retornado somente após a alteração e seu registro de auditoria serem confirmados juntos, então uma gravação bem-sucedida sempre é auditável.
Erros
Formato JSON estável em todos os erros:
{ "error": { "code": "unknown_frameworks", "message": "ids de frameworks desconhecidos: FOO", "unknown": ["FOO"] } }
| 400 | `invalid_request` | Campo(s) de nível superior desconhecido(s), ou um corpo sem nenhum dos campos conhecidos (atualização vazia). |
| 422 | `invalid_commitments` | `commitments` não é um array de linhas válidas (área desconhecida ou duplicada, texto muito longo, caracteres de controle). `null` é um 400: use `[]` para limpar. || Status | code | Significado |
|---|---|---|
| 400 | invalid_request | Corpo não JSON, formato incorreto do corpo ou uma chave foi passada na URL. |
| 401 | unauthorized | Chave ausente, malformada, inválida, expirada ou revogada. |
| 403 | forbidden | A chave não possui o escopo necessário (config:read / config:write). |
| 422 | invalid_profile | profile não é um objeto, é muito grande ou está muito aninhado. |
| 422 | unknown_frameworks | Um ou mais ids de frameworks não estão no catálogo (veja unknown). |
| 429 | rate_limited | Muitas requisições; reduza a velocidade. |
| 405 | method_not_allowed | Método HTTP não suportado neste endpoint. |
| 500 | internal | Erro inesperado do servidor; é seguro repetir com backoff. |
Limites de taxa
Limites de requisições por chave e por IP protegem o serviço. Mantenha-se abaixo de ~1 requisição/segundo e você nunca verá um 429. A configuração é um plano de controle - você a define ocasionalmente, não em um loop intenso.
GET /v1/frameworks
O catálogo completo e legível por máquina (sem autenticação - aponte seu agente aqui para descobrir ids válidos):
{ "frameworks": [ { "id": "ISO_27001", "name": "ISO 27001:2022", "region": "International" }, … ] }Catálogo de frameworks
O catálogo de frameworks da heyGRC é retornado por GET /v1/frameworks (a contagem cresce com o tempo; não codifique valores fixos). Passe o id canônico em frameworks. Os ids mais comuns:
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 como NIS_2 mais variantes por país (NIS_2_DE, NIS_2_FR, NIS_2_IT, …).
Uma requisição PUT com um id fora do catálogo é rejeitada com 422 unknown_frameworks e os ids problemáticos são ecoados de volta, para que seu agente possa se autocorrigir.
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.
Permissões do aplicativo GitHub
O que o aplicativo GitHub heyGRC pode ler e gravar, e o que nunca faz com seu código-fonte.