API HTTP
API Appaloosa Scout
Interrogez programmatiquement la base CVE des apps iOS, Android, macOS et Windows. 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. |
platform | string | non | Désambiguïse les bundles cross-platform. Valeurs : ios · android · macos · windows. Sans ce paramètre, Scout retourne la première variante trouvée (ex. org.videolan.vlc remonte la variante macOS, préciser platform=android pour cibler l'app Android). |
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 : extrayez votre inventaire {bundle_id, installed_version}, POST à Scout, ingérez les verdicts. La couche de liaison 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.