GitHub Security Advisories Scraper - GHSA CVE Data avatar

GitHub Security Advisories Scraper - GHSA CVE Data

Pricing

from $1.00 / 1,000 results

Go to Apify Store
GitHub Security Advisories Scraper - GHSA CVE Data

GitHub Security Advisories Scraper - GHSA CVE Data

$1/1K πŸ”₯ Scrape the GitHub Advisory Database (GHSA): vulnerabilities with affected packages, ecosystem-specific vulnerable version ranges, first patched version, CVSS, EPSS and CWE. One row per affected package. No API key required.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

ninhothedev

ninhothedev

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

GitHub Security Advisories Scraper (GHSA) β€” Vulnerable Package Version Ranges

Scrape the GitHub Advisory Database (GHSA) into a clean, flat dataset: every vulnerability with its affected packages, the exact vulnerable version range, the first patched version, CVSS, EPSS, CWE and references β€” as JSON, CSV or Excel.

No API key required. No login. No proxy needed.

The point of this actor: a CVE feed tells you that something is vulnerable. GHSA tells you which package, in which ecosystem, in which version range, and what to upgrade to. That is the data you actually need to fix things.


Why this actor exists (and how it differs from CVE feeds)

Generic CVE feeds (NVD, CIRCL, CPE dictionaries) describe vulnerabilities in CPE strings β€” vendor/product/version tuples designed for enterprise asset inventories. They are close to useless for a modern dependency file, because cpe:2.3:a:lodash:lodash:4.17.15 does not tell your resolver that < 4.17.21 is vulnerable and 4.17.21 is the fix.

The GitHub Advisory Database is package-manager native. Every advisory carries a machine-readable list of affected packages with:

  • ecosystem β€” npm, pip, Maven, NuGet, Composer, Go, RubyGems, Rust, GitHub Actions, …
  • package_name β€” the exact registry name (lodash, django, org.bouncycastle:bcprov-jdk18on)
  • vulnerable_version_range β€” e.g. >= 1.59, <= 1.80.1 or < 2.0.2
  • first_patched_version β€” e.g. 1.80.2 (null when no fix exists yet)
  • vulnerable_functions β€” reachable-symbol data where GitHub has it

How this differs from the sibling actors:

ActorWhat it gives you
github-advisories-scraper (this one)GHSA advisories with ecosystem-specific vulnerable version ranges and patched versions, per package
circl-cve-scraperClassic CVE records (CVSS, descriptions, references) from the CIRCL CVE database
nist-cpe-scraperNIST CPE dictionary β€” vendor/product/version identifiers, not package ranges

Use the CVE actors for vulnerability identity and enterprise asset matching. Use this one when you need to know which dependency to bump.


One row per (advisory Γ— affected package)

This is the key design decision, and the reason the output is immediately usable in a spreadsheet.

One GHSA advisory can affect many packages β€” a BouncyCastle advisory in our test run affected 24 Maven artifacts, each with its own range. If we emitted one row per advisory, all of that would be buried in a nested array that Excel and Google Sheets flatten into unusable JSON blobs.

So the actor flattens: an advisory affecting 3 packages produces 3 rows, each carrying the full advisory context (ghsa_id, severity, CVSS, CWE…) plus that package's own ecosystem, package_name, vulnerable_version_range and first_patched_version.

Every row also carries affected_package_count, the total number of packages the advisory affects, so you can always deduplicate back to advisory level (GROUP BY ghsa_id) or spot wide-blast-radius advisories.

An advisory with zero listed packages still produces exactly one row, with the package fields set to null β€” so you never silently lose an advisory.

A real example: filtering npm + critical returned 100 advisories β†’ 225 rows, because 23 of them affected more than one package.


Use cases

  • SCA tooling β€” feed vulnerable version ranges into your own software composition analysis or dependency scanner instead of paying for a commercial feed.
  • Dependency triage β€” join the export against your package-lock.json, requirements.txt, pom.xml or go.sum and find out what is actually exploitable in your tree.
  • Security dashboards β€” build a live view of new critical advisories per ecosystem, with CVSS and EPSS for risk scoring.
  • Patch prioritisation β€” sort by cvss_score and epss_percentage, filter to rows where first_patched_version is not null, and you have a ranked, actionable upgrade list.

Input

FieldTypeDefaultDescription
modeselectadvisoriesWhat to scrape. Currently the GHSA advisory database.
ecosystemselectanyany, npm, pip, rubygems, maven, nuget, composer, go, rust, actions
severityselectanyany, low, medium, high, critical
affectsPackagestringβ€”Only advisories affecting this exact package, e.g. lodash
advisoryTypeselectreviewedreviewed (curated, best quality), malware, unreviewed, any
githubTokenstring (secret)β€”Optional. Raises the rate limit from 60 to 5000 requests/hour
maxItemsinteger200Max dataset rows (max 5000). Remember: rows β‰  advisories
{
"mode": "advisories",
"ecosystem": "npm",
"severity": "critical",
"advisoryType": "reviewed",
"maxItems": 200
}

Rate limits β€” read this before a big run

The advisories endpoint is fully public; the actor works with no credentials at all. But GitHub applies its standard API rate limit:

ModeLimit
Keyless (default)60 requests/hour, per IP
With a githubToken5000 requests/hour

Each request returns up to 100 advisories, so keyless you can pull roughly 6000 advisories per hour β€” plenty for most filtered runs. If you want to mirror the whole database or run on a tight schedule, create a GitHub personal access token (no scopes required β€” a bare classic token or fine-grained token with read-only public access is enough) and paste it into githubToken.

The actor reads the x-ratelimit-remaining and x-ratelimit-reset response headers on every page, paces itself accordingly, and if the quota runs out it stops with a descriptive error naming the 60/hour keyless cap and the reset time rather than looping forever. If some rows were already collected, they are kept and the run finishes with a warning instead of failing.

Pagination uses GitHub's opaque cursor exposed only through the Link: …; rel="next" header β€” there is no page or offset parameter. The actor parses that header and stops cleanly when it is absent (the last page).


Output

One row per (advisory Γ— affected package). All fields are nullable.

FieldDescription
ghsa_idGitHub advisory ID, e.g. GHSA-6wcc-39rp-hh9p
cve_idLinked CVE, if one was assigned
summaryShort title (capped at 500 chars)
descriptionFull advisory text (capped at 8000 chars)
severitylow / medium / high / critical
typereviewed / malware / unreviewed
cvss_score, cvss_vectorPrimary CVSS score and vector string
cvss_v3_score, cvss_v4_scoreVersion-specific CVSS scores
epss_percentage, epss_percentileEPSS exploit-prediction values
cwe_ids, cwe_namesWeakness classifications
ecosystemThis row's package ecosystem
package_nameThis row's package name
vulnerable_version_rangee.g. >= 1.59, <= 1.80.1
first_patched_versione.g. 1.80.2, or null if unpatched
vulnerable_functionsAffected symbols, when known
affected_package_countTotal packages affected by the advisory
published_at, updated_atISO-8601 UTC timestamps
github_reviewed_at, nvd_published_atReview / NVD publication timestamps
withdrawn_at, is_withdrawnWithdrawal timestamp and boolean flag
reference_count, referencesReference URLs (up to 10 kept)
credit_loginsGitHub logins credited for the report
source_code_locationUpstream repository URL
urlPublic advisory page on github.com
sourceAlways github-advisories
scraped_atISO-8601 UTC scrape timestamp

Sample row

{
"ghsa_id": "GHSA-574f-3g2m-x479",
"cve_id": "CVE-2026-1000",
"summary": "BouncyCastle vulnerability",
"severity": "critical",
"type": "reviewed",
"cvss_score": 9.8,
"cvss_vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
"cwe_ids": ["CWE-89"],
"ecosystem": "maven",
"package_name": "org.bouncycastle:bcprov-jdk18on",
"vulnerable_version_range": ">= 1.59, <= 1.80.1",
"first_patched_version": "1.80.2",
"vulnerable_functions": ["doFinal"],
"affected_package_count": 24,
"published_at": "2025-11-26T09:31:21Z",
"is_withdrawn": false,
"url": "https://github.com/advisories/GHSA-574f-3g2m-x479",
"source": "github-advisories"
}

Pricing

Roughly $0.50 per 1,000 rows in Apify platform usage. The actor is a lightweight HTTP client on 512 MB β€” no browser, no proxy, no residential traffic. A typical 200-row triage run costs a fraction of a cent.


Notes

  • Data comes from the public GitHub Advisory Database and is licensed CC-BY-4.0 by GitHub. Attribute accordingly if you republish it.
  • advisoryType: reviewed is the default because unreviewed advisories are auto-imported and can contain noisy or incomplete package data.
  • withdrawn advisories are still returned (flagged via is_withdrawn) so you can filter them out yourself rather than having them silently disappear.