API HTTP
API Appaloosa Scout
Interroge programmatiquement la base CVE des apps mobiles iOS/Android. JSON. Une partie est publique (lecture seule, pas d'auth), une partie requiert une clé API. Données sources : NVD (NIST) + CISA KEV, mises à jour en continu.
Endpoints publics
Sans clé API. Rate-limit côté reverse-proxy (Cloudflare / fail2ban). Cache CDN-friendly.
GET
/api/check
Évalue si une version installée d'une app est encore affectée par les CVE connues. Source unique de vérité partagée avec la page HTML /check.
Paramètres (query string)
| Nom | Type | Requis | Description |
|---|---|---|---|
bundle_id | string | oui | Identifiant de l'app (ex. com.microsoft.Office.Outlook). Format : ^[A-Za-z0-9][A-Za-z0-9._-]{1,154}$. |
version | string | non | Version installée à évaluer (ex. 16.78.1). Sans elle, toutes les CVE sont classées indéterminées. |
Exemple
curl 'https://scout.appaloosa.io/api/check?bundle_id=com.microsoft.Office.Outlook&version=4.2244.0'
Réponse (200)
{
"app": {
"bundle_id": "com.microsoft.Office.Outlook",
"name": "Microsoft Outlook",
"platform": "ios",
"current_version": "4.2433.0"
},
"version_checked": "4.2244.0",
"summary": {
"affected_count": 1,
"fixed_count": 7,
"unknown_count": 2,
"kev_affected": 0
},
"affected": [
{
"cve_id": "CVE-2024-XXXXX",
"severity": "HIGH",
"cvss_v3_score": 7.5,
"is_kev": false,
"kev_due_date": null,
"fixed_in_version": "4.2300.0",
"affected_versions": { "start": null, "start_inclusive": false,
"end": "4.2300.0", "end_inclusive": false },
"published": "2024-08-12",
"description": "Microsoft Outlook for iOS …"
}
],
"fixed": [ /* … */ ],
"unknown": [ /* … */ ]
}
Codes de réponse
200— verdict rendu (même sisummary.affected_count = 0)400—{"error": "missing bundle_id"}ou{"error": "invalid_bundle_id"}404—{"error": "not_tracked"}: l'app n'est pas indexée par Scout
Authentification
Les endpoints authentifiés exigent un header X-API-Key: scout_….
Les clés sont générées depuis l'admin par OB2J SAS — contacte scout@appaloosa.io pour en obtenir une.
- Format :
scout_+ 64 chars hex (256 bits d'entropie). - Stockage : SHA-256 en base, jamais en clair. Le token n'apparaît qu'une fois à la création.
- Révocation : effet immédiat (soft delete
revoked_at). - Rate-limit glissant :
rate_per_hour(défaut 30) etrate_per_day(défaut 200). En dépassement :429 Too Many Requests+ headerRetry-After.
Endpoints authentifiés
POST
/api/check/bulk
— verdicts pour N apps en un appel
Pour les connecteurs MDM : extrait ton inventaire {bundle_id, installed_version}, POST à Scout, ingère les verdicts. Le glue layer entre MDM nu et MTD payant. Max 500 apps par appel.
Corps (JSON)
{
"apps": [
{ "bundle_id": "com.microsoft.Office.Outlook", "version": "4.2244.0" },
{ "bundle_id": "com.whatsapp", "version": "2.21.5" },
{ "bundle_id": "us.zoom.videomeetings", "version": "5.13.4" }
]
}
Réponse (200)
{
"summary": {
"total": 3, "affected_apps": 1, "kev_apps": 0,
"clean_apps": 1, "not_tracked": 1, "invalid_input": 0
},
"results": [
{
"bundle_id": "com.microsoft.Office.Outlook",
"name": "Microsoft Outlook",
"platform": "ios",
"current_version": "4.2433.0",
"version_checked": "4.2244.0",
"summary": { "affected_count": 2, "fixed_count": 9, "unknown_count": 0, "kev_affected": 0 },
"affected": [ { "cve_id": "CVE-…", "severity": "HIGH", "cvss_v3_score": 7.5, … } ],
"url": "/apps/com.microsoft.Office.Outlook"
},
{
"bundle_id": "com.whatsapp",
"summary": { "affected_count": 0, … },
"affected": []
},
{
"bundle_id": "us.zoom.videomeetings",
"error": "not_tracked",
"submit_url": "/submit?bundle_id=us.zoom.videomeetings"
}
]
}
Exemple
curl -X POST https://scout.appaloosa.io/api/check/bulk \
-H 'X-API-Key: scout_…' \
-H 'Content-Type: application/json' \
-d '{"apps":[{"bundle_id":"com.whatsapp","version":"2.21.5"}]}'
Codes
200— résultats batch (même si certaines apps ne sont pas suivies, marquéeserror: not_tracked)400— JSON invalide, liste vide, ou > 500 apps401— clé API absente / révoquée429— rate-limit
POST
/api/apps
Ajoute une app au tracking. Asynchrone : un job d'ingestion est créé et drainé par le dispatcher (≤ 1 min).
Corps (JSON)
{
"bundle_id": "com.example.app",
"platform": "ios",
"vendor": "example",
"product": "app"
}
Réponse (202)
{ "job_id": 42, "status_url": "/api/jobs/42" }
Exemple
curl -X POST https://scout.appaloosa.io/api/apps \
-H 'X-API-Key: scout_…' \
-H 'Content-Type: application/json' \
-d '{"bundle_id":"com.example.app","platform":"ios"}'
GET
/api/apps/{bundle_id}
— fiche enrichie
Métadonnées de l'app + classification CVE par version (si ?version= fourni).
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
bundle_id | string (path) | oui | Identifiant URL-encodé. |
version | string (query) | non | Active la classification affected/fixed/unknown par CVE. |
Exemple
curl 'https://scout.appaloosa.io/api/apps/com.microsoft.Office.Outlook?version=4.2244.0' \
-H 'X-API-Key: scout_…'
GET
/api/apps/{bundle_id}/diff
— diff CVE entre 2 versions
Liste les CVE corrigées (et éventuellement introduites) entre deux versions observées. Sert à justifier auprès du RSSI un push de version.
Paramètres
bundle_id(path)from(query, requis) — ex.17.2to(query, requis) — ex.17.5
Exemple
curl 'https://scout.appaloosa.io/api/apps/com.microsoft.Office.Outlook/diff?from=4.2244.0&to=4.2433.0' \
-H 'X-API-Key: scout_…'
Réponse (200)
{
"bundle_id": "com.microsoft.Office.Outlook",
"from": "4.2244.0", "to": "4.2433.0",
"summary": { "fixed_between_count": 4, "introduced_between_count": 0, "common_count": 12, "kev_fixed_between": 1 },
"fixed_between": [ { "cve_id": "CVE-…", "severity": "HIGH", … } ],
"introduced_between": [],
"common": [ /* … */ ]
}
GET
/api/jobs/{id}
— statut d'un job d'ingestion
Polling : pending → running → done|error. Quand done, result contient la fiche enrichie complète.
Exemple
curl https://scout.appaloosa.io/api/jobs/42 -H 'X-API-Key: scout_…'
Backoff exponentiel recommandé (1s, 2s, 4s…). Un job typique se finit en 5-15 s (network store enrich).
Codes d'erreur
| Code | Body | Quand |
|---|---|---|
400 | {"error":"missing bundle_id"} | Paramètre requis manquant. |
400 | {"error":"invalid_bundle_id"} | Format de bundle_id invalide. |
401 | {"error":"unauthorized"} | Clé API absente / révoquée / expirée. |
404 | {"error":"not_tracked"} | L'app n'est pas dans le catalogue Scout. Soumets-la via /submit. |
429 | {"error":"rate_limited"} | Rate-limit dépassé. Retry-After en header. |
503 | Service Unavailable | Mise à jour de données en cours (post-deploy). Retry-After: 30. |
Clé API
Besoin d'une clé ?
Écris à scout@appaloosa.io avec ton cas d'usage (admin MDM, SOC, recherche…). Réponse sous 48 h ouvrées. Une clé d'évaluation gratuite est disponible pour les flottes < 500 devices.
Pour les usages publics anonymes sans clé, l'endpoint /api/check couvre déjà la lookup version-vs-CVE.