Aller au contenu
appaloosa scout logo main rounded
fr en

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)

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.

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 : 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é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.