Docs
Guide de l'API GPORais
L’API GPORais répond à une question précise : cette clé de registre, cet OMA-URI ou ce nom de stratégie correspond-il à un paramètre GPO réel, et à quelle condition ? Elle sert aux scripts de déploiement, aux outils d’audit et aux agents IA qui doivent vérifier une valeur avant de l’écrire sur un parc.
Chaque réponse dit d’où vient l’information (source Microsoft, version) et de quand datent les données. L’API ne devine jamais : quand elle ne sait pas, elle le dit.
Base de l’API :
https://api.gporais.com— aucune inscription pour commencer.
Premier appel en 30 secondes
Le point d’entrée de santé est public. Collez l’adresse dans votre navigateur, ou lancez :
curl https://api.gporais.com/v1/health
{
"status": "ok",
"dataset": { "version": "6aa00495", "generatedAt": "2026-09-08T12:50:29Z" },
"counts": { "parametres": 19446, "registrePairs": 33168 }
}
dataset est la pièce importante : la version et la date des données que l’API
utilise. Vous la retrouverez sur chaque réponse.
Deuxième appel, toujours sans outil : ouvrez
https://api.gporais.com/v1/setting/wuau-autoupdatecfg?lang=fr-FR
dans votre navigateur. Vous obtenez la fiche complète d’un paramètre, en JSON.
Les points d’entrée
| Méthode | Chemin | Question posée |
|---|---|---|
POST | /v1/resolve | « Cette clé et cette valeur de registre, c’est quel paramètre ? Est-il valable sur mon OS ? » |
POST | /v1/csp | « Cet OMA-URI Intune, c’est quelle GPO et quelle clé de registre ? » |
POST | /v1/search | « Quel paramètre porte ce nom ? » |
GET | /v1/setting/{slug} | « Donne-moi tout sur ce paramètre. » |
GET | /v1/health | « Le service répond-il, et avec quelles données ? » |
Les POST attendent un corps JSON avec l’en-tête Content-Type: application/json. Le champ
lang vaut fr-FR ou en-US ; il décide de la langue des libellés renvoyés.
Recette 1 — Vérifier une clé de registre avant de la déployer
C’est l’usage principal. Vous avez un chemin de registre et un nom de valeur ; vous voulez savoir à quel paramètre GPO ils correspondent et s’ils s’appliquent à votre version de Windows.
PowerShell — construisez le corps avec ConvertTo-Json : vous n’avez pas à échapper
les barres obliques inverses à la main.
$body = @{
key = 'HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU'
value = 'NoAutoUpdate'
lang = 'fr-FR'
targetOs = 'Windows 11 24H2'
} | ConvertTo-Json
$r = Invoke-RestMethod -Uri 'https://api.gporais.com/v1/resolve' -Method Post `
-ContentType 'application/json; charset=utf-8' -Body $body
$r.result.compatibility.verdict # supported
$r.result.matches | Select-Object slug, displayName
curl — dans un corps JSON, chaque \ du chemin s’écrit \\.
curl -X POST 'https://api.gporais.com/v1/resolve' \
-H 'Content-Type: application/json' \
--data '{"key":"HKLM\\Software\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU","value":"NoAutoUpdate","lang":"fr-FR","targetOs":"Windows 11 24H2"}'
Sous Windows PowerShell 5.1,
curlest un alias d’Invoke-WebRequest. Tapezcurl.exepour appeler le vrai curl, ou utilisez l’exemple PowerShell ci-dessus.
Python
import requests # pip install requests
r = requests.post("https://api.gporais.com/v1/resolve", json={
"key": r"HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU",
"value": "NoAutoUpdate",
"lang": "fr-FR",
"targetOs": "Windows 11 24H2",
}, timeout=30)
r.raise_for_status()
data = r.json()
print(data["result"]["compatibility"]["verdict"]) # supported
Réponse réelle (abrégée : les autres champs de chaque paramètre sont omis) :
{
"query": {
"key": "software\\policies\\microsoft\\windows\\windowsupdate\\au",
"value": "noautoupdate",
"lang": "fr-FR",
"hive": "HKLM",
"targetOs": "Windows 11 24H2"
},
"result": {
"matches": [
{
"slug": "wuau-autoupdatecfg",
"displayName": "Configuration du service Mises à jour automatiques",
"class": "Machine",
"registryKey": "Software\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU",
"valueName": "NoAutoUpdate",
"source": "windows",
"csp": { "omaUri": "./Device/Vendor/MSFT/Policy/Config/Update/AllowAutoUpdate" }
},
{ "slug": "icm-internetmanagement-restrictcommunication-2" }
],
"compatibility": {
"verdict": "supported",
"reason": "target build 10.0.26100 (Windows 11 24H2) meets minimum 10.0.19041.1202",
"targetBuild": "10.0.26100",
"requiredBuild": "10.0.19041.1202"
}
},
"confidence": "official",
"provenance": { "source": "windows", "sourceVersion": "Windows 11 25H2",
"learnUrl": "https://learn.microsoft.com/…/policy-csp-update#allowautoupdate" },
"dataset": { "version": "6aa00495", "generatedAt": "2026-09-08T12:50:29Z" },
"warnings": [
"The registry pair HKLM\\…\\au\\noautoupdate is written by 2 parameters: wuau-autoupdatecfg, icm-internetmanagement-restrictcommunication-2. Returning all matches and letting the agent choose."
]
}
Trois choses à lire dans cette réponse :
queryest la requête telle que l’API l’a comprise : chemin normalisé en minuscules, rucheHKLMextraite. Vérifiez-la d’abord si le résultat vous surprend.- Deux paramètres écrivent la même valeur de registre. L’API ne choisit pas à votre
place : elle renvoie les deux et le dit dans
warnings. Ce n’est pas une erreur, c’est une information que votre script doit traiter. compatibility.verdictvautsupported: Windows 11 24H2 (build 10.0.26100) dépasse le minimum documenté (10.0.19041.1202).
La ruche est déduite du chemin : HKLM\… et HKEY_LOCAL_MACHINE\… donnent le même
résultat, l’API normalise les deux en HKLM.
Recette 2 — Quand l’OS cible est ambigu
Retirez la famille d’OS et envoyez seulement "targetOs": "22H2". La réponse réelle :
"compatibility": {
"verdict": "unknown",
"reason": "version 22H2 ambigue : Windows 10 (10.0.19045) ou Windows 11 (10.0.22621). Precisez la famille (ex. \"Windows 10 22H2\") ou fournissez le numero de build."
}
C’est la règle fondatrice de l’API : elle ne comble jamais une absence par une
supposition. « 22H2 » existe sous Windows 10 et sous Windows 11, avec deux builds
différents ; plutôt que de parier, l’API vous donne les deux candidats et la façon de
lever l’ambiguïté. Écrivez Windows 10 22H2, Windows 11 22H2, ou directement un numéro
de build.
Les quatre verdicts possibles :
| Verdict | Signification |
|---|---|
supported | Le build cible atteint le minimum documenté. |
unsupported | Le build cible est en dessous du minimum documenté. |
unverified | Microsoft indique un minimum, mais sans numéro de build exploitable. |
unknown | L’OS cible est absent, non reconnu ou ambigu. |
Recette 3 — Partir d’un OMA-URI Intune
Vous administrez avec Intune et voulez retrouver la GPO et la clé de registre équivalentes :
$body = @{ omaUri = './Device/Vendor/MSFT/Policy/Config/Update/AllowAutoUpdate'; lang = 'fr-FR' } |
ConvertTo-Json
$r = Invoke-RestMethod -Uri 'https://api.gporais.com/v1/csp' -Method Post `
-ContentType 'application/json; charset=utf-8' -Body $body
$r.result.matches | Select-Object slug, registryKey, valueName
La réponse réelle renvoie wuau-autoupdatecfg avec "confidence": "official" : la
correspondance est affirmée par Microsoft, pas déduite.
Recette 4 — Trouver un paramètre par son nom
curl -X POST 'https://api.gporais.com/v1/search' \
-H 'Content-Type: application/json' \
--data '{"q":"DisableSearchHistory","lang":"fr-FR","limit":3}'
Réponse réelle : un résultat, search-disablesearchhistory.
À savoir : la recherche est faite pour les noms, pas pour les phrases. Elle trouve très bien un nom technique (
DisableSearchHistory,NoAutoUpdate) ou quelques mots-clés anglais (automatic updates). Une phrase en français (« désactiver les mises à jour automatiques ») donne peu ou pas de résultats pertinents. Pour une recherche en langage naturel, utilisez la barre de recherche du site ; pour un script, passez le nom de la valeur ou de la stratégie.
Recette 5 — Récupérer la fiche complète d’un paramètre
Le slug est l’identifiant stable d’un paramètre : c’est aussi la fin de son adresse sur
gporais.com.
curl 'https://api.gporais.com/v1/setting/wuau-autoupdatecfg?lang=fr-FR'
Sans ?lang=, la fiche est renvoyée en anglais. La réponse contient result.setting : le
chemin dans la console GPO, la clé et les valeurs de registre, les éléments configurables,
le mapping Intune quand il existe, et les versions de Windows prises en charge.
Recette 6 — Vérifier une liste de clés en lot
Vous avez un fichier CSV de clés à contrôler avant un déploiement. Ce script les vérifie une par une en respectant la limite de débit anonyme (10 requêtes par minute) :
# cles.csv : key,value
# HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU,NoAutoUpdate
$targetOs = 'Windows 11 24H2'
function Test-Cle($key, $value) {
$body = @{ key = $key; value = $value; lang = 'fr-FR'; targetOs = $targetOs } | ConvertTo-Json
for ($essai = 1; $essai -le 2; $essai++) {
try {
return Invoke-RestMethod -Uri 'https://api.gporais.com/v1/resolve' -Method Post `
-ContentType 'application/json; charset=utf-8' -Body $body
} catch {
if ($_.Exception.Response.StatusCode.value__ -ne 429 -or $essai -eq 2) { throw }
Write-Warning 'Limite de débit atteinte : pause d''une minute, puis nouvel essai.'
Start-Sleep -Seconds 60
}
}
}
Import-Csv .\cles.csv | ForEach-Object {
$r = Test-Cle $_.key $_.value
[pscustomobject]@{
Cle = "$($_.key)\$($_.value)"
Parametres = ($r.result.matches.slug -join ', ')
Verdict = $r.result.compatibility.verdict
Alertes = $r.warnings.Count
}
Start-Sleep -Seconds 7 # 10 requêtes par minute en accès anonyme
} | Format-Table -AutoSize
Avec une clé d’API, vous pouvez descendre la pause à une seconde (60 requêtes par minute).
Une clé sans paramètre correspondant n’est pas une erreur : result.matches est vide et
result.reason explique pourquoi.
Lire une réponse : l’enveloppe
Chaque réponse porte les six mêmes champs de premier niveau. C’est ce qui permet à un script de distinguer une preuve, une déduction et une incertitude.
| Champ | Ce qu’il garantit |
|---|---|
query | La requête normalisée que l’API a réellement évaluée. |
result | Les correspondances, la fiche demandée, ou une raison quand rien ne correspond. |
confidence | official : Microsoft affirme la correspondance. derived : GPORais l’a déduite. none : aucune correspondance — et result.reason explique pourquoi. |
provenance | La source, sa version et le lien Microsoft Learn quand il existe. |
dataset | Version et date des données. C’est votre preuve de fraîcheur. |
warnings | Ce que l’API a remarqué sans trancher à votre place. |
confidence: "none" est une réponse, pas une erreur. Pour environ trois paramètres sur
quatre, il n’existe aucun équivalent Intune : le dire clairement, avec la raison, est le
service rendu.
Limites à connaître avant d’automatiser
| Accès anonyme | Avec une clé | |
|---|---|---|
| Préfixe | /v1/ | /k/v1/ + en-tête X-API-Key |
| Débit | 10 requêtes / minute par adresse IP | 60 requêtes / minute par adresse IP |
| Inscription | aucune | sur demande (voir plus bas) |
| Coût | gratuit | gratuit |
Ce qu’il faut savoir sur ces limites, parce que votre script doit en tenir compte :
- Au-delà, vous recevez un HTTP
429, jusqu’à la fin de la fenêtre d’une minute. Ce429a un corps vide et aucun en-têteRetry-After: attendez une minute avant de reprendre. - Il n’y a pas de compteur de requêtes restantes. Les réponses portent
X-GPORais-Tier(anonymousoukey) etX-RateLimit-Limit(10 ou 60), mais rien qui décompte. Espacez vos appels plutôt que d’attendre le429. - Le blocage n’est pas instantané. L’hébergeur peut mettre une dizaine de secondes à l’appliquer : une courte rafale peut passer. Ne comptez pas là-dessus, la limite reste la règle.
- La recherche porte sur les noms, pas sur le langage naturel (voir la recette 4).
- Environ un paramètre sur quatre a un équivalent Intune. Pour les autres, l’API répond
confidence: "none"avec la raison. - L’API ne redistribue pas les textes explicatifs de Microsoft : elle sert des faits (chemins, valeurs, OMA-URI, versions) et un lien vers la source.
- Les données de l’API peuvent avoir un décalage avec celles du site. Comparez
dataset.generatedAtà vos exigences de fraîcheur ; c’est précisément pour ça qu’il est renvoyé à chaque fois. - Aucune garantie de service. Les données sont fournies en l’état : vérifiez avant toute écriture sur un parc de production.
Erreurs
Les erreurs HTTP suivent le format « problem details » de la
RFC 9457. Exemple réel, un appel sous /k/v1/
sans clé :
{
"type": "urn:problem:gporais-api:unauthorized",
"title": "Unauthorized",
"status": 401,
"detail": "API key missing or invalid."
}
| Code | Quand | Que faire |
|---|---|---|
401 | Clé absente, invalide ou révoquée sous /k/v1/ | Vérifiez l’en-tête X-API-Key, ou repassez sous /v1/. |
429 | Limite de débit dépassée | Attendez une minute. Corps vide, pas de Retry-After. |
200 + confidence: "none" | Aucun paramètre ne correspond | Ce n’est pas une erreur : lisez result.reason. |
Un slug inconnu, par exemple, ne renvoie pas 404 mais un 200 avec :
"result": { "reason": "No setting matches slug ce-slug-nexiste-pas for en-US." },
"confidence": "none"
Obtenir une clé
Il n’y a pas d’inscription en libre-service. Demandez une clé via les coordonnées de la page À propos, en décrivant l’usage prévu. Ensuite :
Invoke-RestMethod -Uri 'https://api.gporais.com/k/v1/resolve' -Method Post `
-Headers @{ 'X-API-Key' = 'VOTRE_CLE' } `
-ContentType 'application/json; charset=utf-8' -Body $body
Mêmes points d’entrée, préfixe /k/v1/ au lieu de /v1/, et six fois plus de débit. Une
clé peut être révoquée en cas d’abus. Le point d’entrée de santé reste public sur les deux
préfixes.
Aller plus loin
La référence de l’API détaille chaque champ, la couverture mesurée des données et les cas limites de compatibilité. Pour afficher une fiche GPORais directement dans votre intranet ou votre wiki, voyez Intégrer une fiche.
GPORais est une ressource technique indépendante, ni affiliée à Microsoft ni validée par lui.