Aller au contenu
Appaloosa Scout
Sélection de la langue
fr en

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)

NomTypeRequisDescription
bundle_idstringouiIdentifiant de l'app (ex. com.microsoft.Office.Outlook). Format : ^[A-Za-z0-9][A-Za-z0-9._-]{1,154}$.
versionstringnonVersion installée à évaluer (ex. 16.78.1). Sans elle, toutes les CVE sont classées indéterminées.
platformstringnonDé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 si summary.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) et rate_per_day (défaut 200). En dépassement : 429 Too Many Requests + header Retry-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ées error: not_tracked)
  • 400 — JSON invalide, liste vide, ou > 500 apps
  • 401 — clé API absente / révoquée
  • 429 — 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

NomTypeRequisDescription
bundle_idstring (path)ouiIdentifiant URL-encodé.
versionstring (query)nonActive 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.2
  • to (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

CodeBodyQuand
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.
503Service UnavailableMise à 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.