NuGet Scraper · .NET Packages, Versions, Downloads & Authors avatar

NuGet Scraper · .NET Packages, Versions, Downloads & Authors

Pricing

from $0.85 / 1,000 nuget package record scrapeds

Go to Apify Store
NuGet Scraper · .NET Packages, Versions, Downloads & Authors

NuGet Scraper · .NET Packages, Versions, Downloads & Authors

Scrape NuGet .NET packages, versions, download counts, authors, tags, and dependencies. Search by keyword, tag, framework, author, or package ID prefix.

Pricing

from $0.85 / 1,000 nuget package record scrapeds

Rating

0.0

(0)

Developer

Tarek Etman

Tarek Etman

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

reapX — public sources in, addressable records out

NuGet Scraper · .NET Packages, Versions, Downloads & Authors

NuGet Scraper extracts comprehensive public package metadata from NuGet, the official package manager for .NET. Collect package identifiers, titles, version history, download statistics, authors, project repository URLs, license terms, tags, framework targets, and security vulnerability alerts.

Maintained by reapX. Every row cites the Apify run that produced it — nothing is inferred, modelled or filled in, and a field absent from the source is absent from the row. The extracted archive for this source is browsable at reapx.dev/data/nuget-scraper/ and mirrored as an open dataset on Hugging Face and Kaggle. Questions: reapxdev@proton.me


⬇️ Input

Every field is described here exactly as the Actor reads it. Run it with the prefilled input and it returns real rows without any further configuration.

FieldTypeRequiredPrefilledWhat it does
querystringyes"json"Search query string for NuGet packages. Supports free text (e.g. json), tag filters (e.g. tag:logging), target framework (e.g. framework:net8.0), author (e.g. author:microsoft), or package...
includePrereleasebooleannofalseInclude pre-release packages (alpha, beta, RC versions) in search results. When enabled, pre-release package metadata is scraped alongside stable releases.
packageTypestringno-Narrow the search to one kind of NuGet package: a library, a .NET CLI tool or a project/item template.
includeDependenciesbooleannofalseRead each package's registration index and add dependencies, dependencyCount, targetFrameworks, published, licenseExpression and listed. The search endpoint carries none of those at any...
minDownloadsintegerno-Minimum total download count filter. Package records with fewer total downloads than this value will be excluded from the dataset results.
maxItemsintegeryes50Maximum package records to return and push to the default dataset (1 to 5,000).
maxPagesintegeryes5Maximum search result pages to fetch from the NuGet V3 search API (1 to 100). Each page retrieves up to 100 package items.

What empty means, and what a larger value costs

The two questions an input table normally does not answer. Both columns are read off this Actor's own code and its own price list.

FieldLeft emptyTurned up
queryLeave empty to search popular default packages.Narrowing this reduces rows returned, so it lowers the bill.
includePrereleaseOnly stable release packages are returned. Disabling pre-release excludes unfinished packages and speeds up processing.Turning this on costs extra requests to the source, not extra rows.
packageTypeLeave empty to search every package type, which is what nuget.org itself does.This filter is applied by the search service, not afterwards, so it makes runs cheaper rather than more expensive. Measured live: json matches 11,017 packages, json restricted to...
includeDependenciesThose six fields stay empty, 0 and true.One extra request per package, run 5 at a time, so a 500-package run takes noticeably longer. It adds no rows and no charge.
minDownloadsLeave empty for no minimum download constraint.Narrowing this reduces rows returned, so it lowers the bill.
maxItemsFalls back to 50Each row returned is one $0.001 charge, so this field is your cost cap as well as your row cap. At the ceiling of 5,000 rows that is $5.00 at list price.
maxPagesFalls back to 5More pages means more HTTP requests to the source and a longer run. It raises the ceiling on rows without raising the row cap itself.

⬆️ Output

One row per record, as JSON, CSV, Excel or XML, and through the API. Every field below is on every row this Actor writes; a field the source did not return is empty rather than guessed.

FieldTypeWhat it gives youExample
packageNamestringUnique .NET package identifier on NuGet (e.g. Newtonsoft.Json)"Newtonsoft.Json"
titlestringDisplay title of the NuGet package"Json.NET"
versionstringLatest published version string"13.0.4"
descriptionstringFull package description detailing purpose and usage"Json.NET is a popular high-performance JSON framework fo...
summarystringShort summary description of the package"High-performance JSON framework for .NET"
authorsarrayList of package authors["James Newton-King"]
ownersarrayList of NuGet package owners/publishers["newtonsoft", "nuget"]
totalDownloadsintegerCumulative total download count across all versions982341234
projectUrlstringURL to the open-source project repository or homepage"https://www.newtonsoft.com/json"
licenseUrlstringURL to the package license terms"https://licenses.nuget.org/MIT"
iconUrlstringURL to the package logo/icon image"https://api.nuget.org/v3-flatcontainer/newtonsoft.json/1...
tagsarrayPackage categorization and search keywords["json", "serialization", "xml"]
verifiedbooleanWhether the package owner prefix is verified by NuGettrue
versionsCountintegerTotal number of published releases and versions45
latestVersionDownloadsintegerDownload count specifically for the latest release168874731
packageTypesarrayTypes of NuGet package (e.g. Dependency, DotnetTool)["Dependency"]
hasVulnerabilitiesbooleanIndicates whether known security vulnerabilities exist for any versionfalse
vulnerabilitiesCountintegerTotal number of recorded security advisory vulnerabilities0
publishedstringWhen the current version was published to nuget.org. Empty unless Include Dependencies & Publish Date is on."2026-07-31T09:14:02.473+00:00"
licenseExpressionstringLicence the package declares, as an SPDX expression. Empty unless Include Dependencies & Publish Date is on, or when..."Apache-2.0"
listedbooleanFalse when the current version has been unlisted from search by its owner but is still installable by exact version.true
dependencyCountintegerDistinct package dependencies across every target framework of the current version. Zero unless Include Dependencies &...24
targetFrameworksarrayFrameworks the current version declares a dependency group for, such as .NETStandard2.0 or net8.0.[".NETStandard2.0", "net8.0"]
dependenciesarrayEach dependency as package id, version range and the target framework that declares it.[{"id": "System.Text.Json", "range": "[8.0.0, )", "target...

Dataset views

The dataset ships with named views, so the Output tab, the API and any agent reading this Actor get the columns that matter for a job without asking for all of them.

Overview (?view=overview) - 7 columns: packageName, title, version, totalDownloads, authors, tags, verified

ColumnHeader
packageNamePackage
titleTitle
versionVersion
totalDownloadsTotal Downloads
authorsAuthors
tagsTags
verifiedVerified Owner

Downloads & Versions (?view=downloads) - 7 columns: packageName, version, totalDownloads, latestVersionDownloads, versionsCount, hasVulnerabilities, vulnerabilitiesCount

ColumnHeader
packageNamePackage
versionVersion
totalDownloadsTotal Downloads
latestVersionDownloadsDownloads (this version)
versionsCountVersions Published
hasVulnerabilitiesKnown Vulnerabilities
vulnerabilitiesCountAdvisory Count

Dependencies & Frameworks (?view=dependencies) - 7 columns: packageName, version, dependencyCount, targetFrameworks, dependencies, licenseExpression, published

ColumnHeader
packageNamePackage
versionVersion
dependencyCountDependencies
targetFrameworksTarget Frameworks
dependenciesDependency List
licenseExpressionLicense
publishedPublished

Authors & Project Links (?view=authors) - 7 columns: packageName, authors, owners, projectUrl, licenseUrl, iconUrl, packageTypes

ColumnHeader
packageNamePackage
authorsAuthors
ownersOwners
projectUrlProject URL
licenseUrlLicense URL
iconUrlIcon
packageTypesPackage Types

Fetch one directly:

GET https://api.apify.com/v2/datasets/{datasetId}/items?view=overview&format=csv

One real row

Unedited, from this Actor's own most recent successful run.

{
"packageName": "Dapper",
"title": "Dapper",
"version": "2.1.79",
"description": "A high performance Micro-ORM supporting SQL Server, MySQL, Sqlite, SqlCE, Firebird etc. Major Sponsor: Dapper Plus from ZZZ Projects.",
"summary": "",
"authors": [
"Sam Saffron,Marc Gravell,Nick Craver"
],
"owners": [
"Dapper",
"marc.gravell",
"nick.craver"
],
"totalDownloads": 730063539,
"projectUrl": "https://github.com/DapperLib/Dapper",
"licenseUrl": "https://www.nuget.org/packages/Dapper/2.1.79/license",
"iconUrl": "https://api.nuget.org/v3-flatcontainer/dapper/2.1.79/icon",
"tags": [
"orm",
"sql",
"micro-orm"
],
"verified": true,
"versionsCount": 63,
"latestVersionDownloads": 6769082,
"packageTypes": [
"Dependency"
],
"hasVulnerabilities": false,
"vulnerabilitiesCount": 0,
"published": "2026-05-16T20:39:31.827+00:00",
"licenseExpression": "Apache-2.0",
"listed": true,
"dependencyCount": 5,
"targetFrameworks": [
".NETFramework4.6.1",
"net8.0",
"net10.0",
".NETStandard2.0"
],
"dependencies": [
{
"id": "Microsoft.Bcl.AsyncInterfaces",
"range": "[10.0.8, )",
"targetFramework": ".NETFramework4.6.1"
},
{
"id": "System.Threading.Tasks.Extensions",
"range": "[4.6.3, )",
"targetFramework": ".NETFramework4.6.1"
},
{
"id": "Microsoft.Bcl.AsyncInterfaces",
"range": "[10.0.8, )",
"targetFramework": ".NETStandard2.0"
},
{
"id": "System.Reflection.Emit.Lightweight",
"range": "[4.7.0, )",
"targetFramework": ".NETStandard2.0"
},
{
"id": "System.Threading.Tasks.Extensions",
"range": "[4.6.3, )",
"targetFramework": ".NETStandard2.0"
}
]
}

🧪 Worked examples

Every block below is an input this Actor has actually run, with the row count of the run that produced it. Copy one straight into the Console.

ORM libraries with dependencies and publish dates

{
"query": "tag:orm",
"packageType": "Dependency",
"includeDependencies": true,
"maxItems": 25,
"maxPages": 1
}

That run returned 25 rows in 5s.

Scrape top .NET JSON parsing, formatting, and serialization libraries from NuGet.

{
"query": "json",
"maxItems": 50
}

That run returned 50 rows.

High-Download .NET Utility Libraries

Extract popular .NET utility packages filtered by a 100,000+ total downloads threshold.

{
"query": "utility",
"minDownloads": 100000,
"maxItems": 50
}

That run returned 50 rows.

Prerelease & Preview .NET Packages

Scrape package search results including preview, alpha, and beta release versions.

{
"query": "json",
"includePrerelease": true,
"maxItems": 50
}

That run returned 50 rows.

Logging & Diagnostics Frameworks

Extract .NET logging abstractions, sinks, structured loggers, and diagnostic tools.

{
"query": "tag:logging",
"maxItems": 50
}

That run returned 50 rows.

MediatR CQRS In-Process Messaging

Collect MediatR mediator pattern implementations, request handlers, and pipeline behaviors.

{
"query": "id:MediatR",
"maxItems": 50
}

That run returned 50 rows.

How it works

The endpoint it calls

Plain HTTP against the source's own public API. No headless browser, no login, no key of yours:

https://azuresearch-usnc.nuget.org/query
https://api.nuget.org/v3/registration5-gz-semver2

The Azure Search endpoint behind nuget.org - the same service the gallery's own search box calls, so the ranking you get here is the ranking a .NET developer sees.

The paging it does

Paging is skip and take, 100 packages per request, up to Max Pages requests. The client stops as soon as a page returns nothing, so a narrow query costs one request rather than the whole page budget.

Query syntax is the gallery's own, and it is what makes one task genuinely different from another: bare words search text, tag:logging filters by tag, author:microsoft by author, id:Serilog by package id prefix, framework:net8.0 by target framework. packageType narrows to libraries, .NET tools or templates - measured live, q=json returns 11,017 hits and q=json&packageType=DotnetTool returns 350.

semVerLevel=2.0.0 is always sent, so SemVer 2.0.0 packages are not silently missing from your results. De-duplication is by lowercased package id across every page.

The rate it holds

Every request is retried up to 3 times, with the wait doubling between attempts, and HTTP 429, 500, 502, 503, 504 are treated as retryable rather than fatal. Each request times out at 15s, detail requests run 5 at a time and never more.

One request at a time, retried up to 3 times with the delay doubling between attempts. No key, no account, no quota to apply for.

What you are charged

One package-scraped event per row written to the dataset, $0.001 at list price. Charged for each NuGet package record scraped and pushed to default dataset

Apify plan tierPrice per row
Free$0.001
Bronze$0.00095
Silver$0.0009
Gold$0.00085
Platinum$0.0008
Diamond$0.00075

Apify platform usage is absorbed, not passed on, so the row price is the whole bill.

Why the dataset is correct at every moment

Rows are written and charged one at a time as the pages come back, so a run stopped by your budget cap leaves every row it had already collected and charges for those only.

⚠️ Error reference

Derived from this Actor's own exception classes and the HTTP branches in its client. The run always reports what happened in its status message, so you never need the log to know what you got.

RaisedWhenWhat the run does
BadQueryRaised when the NuGet API returns a 400 Bad Request error.Run fails with: NuGet API rejected query input:
SourceBlockedRaised when the NuGet API is unreachable, rate limited, or returning 5xx/403 errors.Run fails with: NuGet API unreachable or throttled:

HTTP statuses the client actually handles

StatusHandling
429Retried with backoff. The run continues if a later attempt succeeds.
500Retried with backoff. The run continues if a later attempt succeeds.
502Retried with backoff. The run continues if a later attempt succeeds.
503Retried with backoff. The run continues if a later attempt succeeds.
504Retried with backoff. The run continues if a later attempt succeeds.
400The source rejected the query itself, so retrying it cannot help; the input is at fault.

What each outcome costs

OutcomeRowsCharged
Run finishedEverything the source returned for your filtersOne package-scraped per row
Nothing matched your filters0Nothing
Source refused or was unreachableWhatever was already collectedOnly the rows you got
Budget cap reached mid-runThe rows collected before the capOnly those rows

Status messages this Actor can end on, verbatim from its own source:

  • Run budget of $ cannot cover a single event record at $
  • NuGet API unreachable or throttled:
  • No NuGet packages found matching criteria. Zero charged.
  • Pushed

❓ FAQ

Can I search packages by target framework?

Yes. Use the framework: filter prefix in the query field, such as framework:net8.0, framework:net9.0, or framework:netstandard2.0.

How do I filter by specific package authors or owners?

Use the author: filter prefix in the query field, for example author:microsoft or author:amazon.

How do I scrape pre-release package versions?

Set "includePrerelease": true in your run input. By default, only stable releases are included.

What happens if a search query matches no packages?

The scraper completes with 0 records pushed and charges $0.00.


Do I need an API key, an account or a proxy?

No. The Actor reads the source's public interface over plain HTTP, with no credential of yours anywhere in the run and no headless browser. You need an Apify account and nothing else.

What does a run cost?

One package-scraped event per row written, $0.001 at list price, falling to $0.00075 on the highest Apify plan tier. Apify platform usage is absorbed rather than passed on, so the row price is the whole bill. A run that matches nothing is charged nothing.

How many rows can one run return?

Up to 5,000, set by the maximum-results field, which is also your cost cap. Raise it for a bigger slice, or set a Max total charge on the run and the Actor will stop cleanly when it gets there.

Can I get just some of the columns?

Yes. The dataset ships named views (overview, downloads, dependencies, authors); add ?view=<name> to the dataset items URL, or pick one in the Output tab, and you get that view's columns in JSON, CSV or Excel.

Can an agent call this?

Yes, through Apify's MCP server at https://mcp.apify.com with nothing to integrate on our side: search-actors finds it, fetch-actor-details returns the input schema above, and call-actor runs it.

Will the dataset still be there next month?

Yes. The run names its own default dataset at startup, and Apify keeps named storages past the retention window that deletes unnamed ones, so the run id in a row you cited a year ago still resolves.

💬 Your feedback

Have feature requests or questions? Contact the maintainers at reapxdev@proton.me or visit reapx.dev.


Unofficial - not affiliated with NuGet / Microsoft. Collects public data only. reapx. Contact reapxdev@proton.me.