Sourcewell Contract Scraper
Pricing
from $5.00 / 1,000 new items
Sourcewell Contract Scraper
Extracts Sourcewell's full cooperative purchasing contract registry from the official XLSX feed and enriches every entry with categories from the HTML listing. Outputs contract numbers, suppliers, descriptions, solicitation titles, maturity dates and categories as a ready-to-use dataset.
Pricing
from $5.00 / 1,000 new items
Rating
0.0
(0)
Developer
Alexei Pannicov
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Sourcewell contract search API alternative — collects the public registry of Sourcewell cooperative purchasing contracts from sourcewell-mn.gov and delivers them as a structured Apify Dataset: ~1,060 contracts with suppliers, descriptions, expiration dates and categories.
It covers the contract registry, not each contract's detail page — so no contract documents, supplier contacts, or full products & services list (see Roadmap).
What this Actor does
- Official spreadsheet feed as the primary source — faster and more
reliable than paging through HTML: one request returns all ~1,060 contracts
with accurate
supplier/description/solicitationTitle/maturityDate - Category enrichment — categories only exist on the HTML listing, so the
Actor crawls it and merges categories into the feed rows by
contractNumber - Category filter and limits — export a single category or cap the dataset size for a quick test run
- Apify platform advantages — run on a schedule, trigger via API, connect to integrations, and monitor runs from the Apify Console
Who is it for
- Procurement and purchasing teams checking what's already covered by Sourcewell cooperative contracts before running their own RFP
- Suppliers and bid consultants tracking competitor contracts and categories on Sourcewell
- Sales and lead-gen teams building a list of active Sourcewell suppliers by category
- Market-intelligence and compliance tools that need an up-to-date, machine-readable copy of the contract registry
🚀 How to use
- Open the Actor's Input tab and optionally set
categoryormaxItems. - Click Start. The Actor downloads the official contract-list spreadsheet feed and parses every contract row.
- It then crawls the
/contract-searchlisting page by page to collect categories for eachcontractNumber. - It merges both sources, optionally filters by
category, and trims tomaxItems. - The result is written to the run's Dataset — open the Output tab or fetch it via the API.
A full run takes a few minutes and returns the complete registry; no proxy, login, or configuration is required.
Input
All input fields are optional — see the Input tab for the full schema:
| Field | Type | Description |
|---|---|---|
category | string | One of the site's 14 top-level categories (dropdown); if omitted, contracts from all categories are returned |
maxItems | integer | Maximum number of contracts in the resulting dataset — handy for a cheap test run |
Output
You can download the dataset in various formats such as JSON, CSV, Excel, or HTML via the Output tab or the API.
[{"contractNumber": "030425-CEN","supplier": "22nd Century Technologies","description": "Public safety and law enforcement software solutions","solicitationTitle": "Public Safety Software","maturityDate": "2029-07-17","categories": ["Office & Technology", "Public Safety"],"detailUrl": "https://www.sourcewell-mn.gov/cooperative-purchasing/030425-CEN"}]
| Field | Type | Description |
|---|---|---|
contractNumber | string | Contract number (stable key, unique per contract) |
supplier | string | Supplier name |
description | string | Short contract description |
solicitationTitle | string | Solicitation/RFP title |
maturityDate | string | Contract expiration date (YYYY-MM-DD) |
categories | string[] | Contract categories — zero or more of the 14 top-level categories |
detailUrl | string | Link to the contract's page on the Sourcewell site |
How it works
The Actor combines two public sources on the official Sourcewell site:
- The official contract-list spreadsheet feed — one request returns every
contract with
contractNumber,supplier,description,solicitationTitleandmaturityDate. This feed has no categories. - The
/contract-searchHTML listing — crawled page by page and used only to collectcategoriespercontractNumber.
Both sources are merged by contractNumber, optionally filtered by
category, trimmed to maxItems, and written to the dataset.
Pricing
This Actor uses Pay Per Event pricing, with no charge for compute time
itself. Each contract written to the dataset is charged one new-item
event, so a run costs exactly as many events as the number of contracts it
delivers. See the Pricing tab on this Actor's page for the exact price
per event.
If you cap a run with Apify's maximum cost per run setting, the Actor stops delivering once that budget is reached instead of writing contracts it cannot charge for. The dataset then holds exactly what you paid for.
Limitations & notes
- A few contracts have an empty
categoriesarray: they are present in the contract feed but not in the HTML listing the categories come from (1,056 of 1,063 contracts had categories in testing). maxItemstrims the final list after both sources are merged, so it caps what you are charged for but doesn't make the run itself much faster.- Contract documents, supplier contacts, supplier websites and the full products & services list live behind each contract's detail page and are not collected by this Actor yet — see the Roadmap below.
🗺 Roadmap
Planned next, in order:
- Contract detail crawling — an optional, higher-priced mode that opens each contract's page to extract contract documents, supplier contacts and website, and the full products & services list.
- Wider source coverage — evaluating whether to also include the A–Z supplier listing and the construction contractors (IDIQ) registry, which sit outside the main contract search.
Need one of these sooner, or a field that isn't in the output yet? Open an issue on the Actor's Issues tab — requests with a concrete use case get prioritized.
Legality
Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.
❓ FAQ
Does the dataset include every Sourcewell contract, or only the ones
matching my category filter?
The Actor always downloads the full contract feed first; category only
filters the final output, so switching categories between runs never requires
a different crawl of the contract list itself.
Where do categories come from?
From the /contract-search HTML listing, matched to feed rows by
contractNumber — the spreadsheet feed itself has no categories. A contract
that is in the feed but missing from the HTML listing comes back with an
empty categories array.
How often is the underlying data updated? Sourcewell refreshes the contract feed on its own schedule, typically daily. The Actor always fetches the current version on each run.
Can I get supplier contacts, contract documents, or the full products & services list? Not yet — that data lives on each contract's detail page and is on the roadmap above.
Can I run this on a schedule?
Yes. Use Apify's Schedules to run it daily or weekly. Pair it with
maxItems or the maximum cost per run setting to keep recurring runs
predictable.
🛟 Support & feedback
Bugs and feature requests — via the Issues tab on this Actor's page. For programmatic access, see the API tab.