Escaneo de vulnerabilidades en dependencias
Comprueba hasta 50 dependencias de código abierto contra OSV.dev en una sola llamada. Devuelve alias CVE, una puntuación base CVSS calculada, identificadores CWE y las versiones exactas que corrigen cada aviso.
¿No tienes una clave API?
Inicia sesión en tu cuenta para crear y gestionar tus claves API.
Guía de integración
Copia un fragmento, sustituye tu clave de API y ejecútalo. Funciona en cualquier cliente HTTP — ejemplos abajo en cURL, JavaScript y Python.
/api/scan-dependencieshttps://www.apipick.comCheck open-source packages against the OSV.dev vulnerability database
packagesarrayobligatorioUp to 50 objects, each with ecosystem, name, and an exact installed version. [{"ecosystem":"npm","name":"lodash","version":"4.17.15"}]
curl -X POST "https://www.apipick.com/api/scan-dependencies" \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"packages": [
{
"ecosystem": "npm",
"name": "lodash",
"version": "4.17.15"
},
{
"ecosystem": "PyPI",
"name": "requests",
"version": "2.19.0"
}
]
}'{
"summary": {
"packages_scanned": 2,
"vulnerable_packages": 2,
"total_vulnerabilities": 8,
"by_severity": {
"critical": 1,
"high": 3,
"medium": 4,
"low": 0,
"none": 0,
"unknown": 0
},
"highest_cvss_score": 9.8
},
"results": [
{
"ecosystem": "npm",
"name": "lodash",
"version": "4.17.15",
"vulnerable": true,
"highest_severity": "HIGH",
"highest_cvss_score": 7.4,
"vulnerability_count": 6,
"vulnerabilities": [
{
"id": "GHSA-35jh-r3h4-6jhm",
"aliases": [
"CVE-2021-23337"
],
"cve": "CVE-2021-23337",
"summary": "Command Injection in lodash",
"severity": "HIGH",
"cvss_score": 7.2,
"cvss_vector": "CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H",
"cwe_ids": [
"CWE-77"
],
"published": "2021-02-15T00:00:00Z",
"fixed_versions": [
"4.17.21"
],
"advisory_url": "https://osv.dev/vulnerability/GHSA-35jh-r3h4-6jhm"
}
],
"error": null
}
],
"source": "OSV.dev (Google Open Source Vulnerabilities, CC-BY-4.0)",
"credits_used": 5,
"remaining_credits": 95
}Diseñada para casos de uso reales
Control de despliegues
Detén una compilación cuando alguna dependencia supere un umbral CVSS. Con una puntuación numérica, la política es una comparación de una línea en vez de un cotejo de cadenas.
Agentes de programación
Deja que un agente compruebe una versión antes de escribirla en un manifiesto y proponga la versión corregida en el mismo turno.
Auditoría de lockfiles
Envía un manifiesto completo en lotes de 50 y obtén un resumen por gravedad para cada servicio, sin ejecutar un escáner en CI.
Diligencia debida de proveedores
Puntúa el conjunto de dependencias declarado por un tercero frente a avisos públicos antes de firmar, con datos que puedes citar.
Campos de la respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| summary.vulnerable_packages | integer | Cuántos de los paquetes enviados tienen al menos un aviso |
| summary.by_severity | object | Recuento de avisos por critical / high / medium / low / none / unknown |
| summary.highest_cvss_score | number | null | Puntuación base CVSS más alta de todo el escaneo |
| results[].vulnerable | boolean | Si esta versión del paquete tiene algún aviso no retirado |
| results[].vulnerabilities[].id | string | Identificador del aviso en OSV, p. ej. GHSA-35jh-r3h4-6jhm |
| results[].vulnerabilities[].cve | string | null | Alias CVE cuando existe |
| results[].vulnerabilities[].severity | string | CRITICAL, HIGH, MEDIUM, LOW, NONE o UNKNOWN |
| results[].vulnerabilities[].cvss_score | number | null | Puntuación base CVSS v3.1 calculada a partir del vector del aviso |
| results[].vulnerabilities[].cwe_ids | string[] | Clasificaciones de debilidad CWE del aviso |
| results[].vulnerabilities[].fixed_versions | string[] | Versiones de este paquete que resuelven el aviso |
| results[].error | string | null | Se rellena cuando ese paquete concreto no se pudo comprobar; el resto sí se devuelve |
| credits_used | integer | Créditos descontados por esta solicitud |
| remaining_credits | integer | Créditos restantes en tu cuenta |
Límites de tasa
La limitación es por clave de API, ventana deslizante de 60 segundos. Al alcanzar el límite recibes un 429 limpio con una cabecera Retry-After.
20req/min
Por clave de API, por endpoint. Ventana deslizante de 60 segundos.
3concurrent
Máximo de peticiones simultáneas en curso por clave de API.
X-RateLimit-LimitMáximo de peticiones permitidas por minutoX-RateLimit-RemainingPeticiones restantes en la ventana actualX-RateLimit-ResetSegundos hasta que se reinicia la ventana actualRetry-AfterSegundos a esperar antes de reintentar (solo en 429)HTTP/1.1 429 Too Many Requests
Retry-After: 12
X-RateLimit-Limit: 20
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 12
{
"error": "rate_limit_exceeded",
"message": "Rate limit exceeded: 20 requests/minute per API key. Retry after 12s.",
"retry_after": 12
}Fuente de datos y licencia
Los avisos proceden de OSV.dev, la base de datos abierta de vulnerabilidades de Google, publicada bajo CC-BY-4.0. OSV unifica en un solo esquema la GitHub Advisory Database, la base de vulnerabilidades de Go, RustSec, PyPA y los rastreadores de seguridad de las principales distribuciones. Nosotros añadimos el cálculo de la puntuación base CVSS y el resumen por paquete.
Preguntas frecuentes
P: ¿De dónde salen los datos de vulnerabilidades?
R: De OSV.dev, la base de datos abierta de vulnerabilidades de Google. Unifica en un solo esquema la GitHub Advisory Database, la base de vulnerabilidades de Go, RustSec, PyPA y los rastreadores de seguridad de las distribuciones, y la publica bajo CC-BY-4.0. Los avisos suelen estar disponibles pocas horas después de su publicación.
P: ¿Cómo se calcula la puntuación CVSS?
R: Los avisos de OSV incluyen la cadena del vector CVSS, pero no el número. Calculamos la puntuación base CVSS v3.1 a partir de ese vector con la fórmula oficial, de modo que obtienes un valor sobre el que fijar umbrales directamente. Si un aviso no tiene vector v3 (solo v4, o un aviso de ecosistema que no lo incluye), cvss_score es null y severity recurre a la calificación del propio publicador.
P: ¿Puedo escanear un lockfile completo?
R: Sí: analízalo por tu lado y envía hasta 50 paquetes por llamada. Cada llamada cuesta 5 créditos con independencia de cuántos paquetes lleve, así que un lote de 50 sale a 0,1 créditos por paquete. Para manifiestos mayores, divídelos en lotes de 50.
P: ¿Admite rangos de versiones?
R: No. Envía la versión exacta instalada, tal como aparece en tu lockfile (4.17.15, no ^4.17.0). OSV compara los rangos con una versión concreta para decidir si está afectada, así que un rango como entrada no tiene una única respuesta.
P: ¿Qué pasa si falla la consulta de un paquete?
R: El escaneo se devuelve igualmente. Ese paquete lleva un campo error y queda excluido de los recuentos del resumen, mientras que el resto se informa con normalidad. La respuesta también incluye packages_failed para que sepas que el resumen está incompleto.