NYC PASSPort Procurement Scraper (RFPs, Bids & Contracts) avatar

NYC PASSPort Procurement Scraper (RFPs, Bids & Contracts)

Pricing

$10.00 / 1,000 procurement records

Go to Apify Store
NYC PASSPort Procurement Scraper (RFPs, Bids & Contracts)

NYC PASSPort Procurement Scraper (RFPs, Bids & Contracts)

NYC PASSPort procurement data: open and historic RFPs, bids and M/WBE solicitations plus awarded NYC government contracts with vendor, amounts and dates, from the PASSPort Public portal. Filter by keyword, agency, method, category, status and date. $0.01/record.

Pricing

$10.00 / 1,000 procurement records

Rating

0.0

(0)

Developer

Jonathan Serle

Jonathan Serle

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 hours ago

Last modified

Share

Pulls New York City government procurement data from the PASSPort Public portal into clean JSON records: open and historic solicitations (RFPs, competitive sealed bids, sole source, micropurchase and M/WBE set-asides) and awarded city contracts with vendor, award and current amounts, encumbered and paid totals, and start, end and registration dates. Filter by keyword, agency, procurement method, industry category, status and date.

PASSPort Public is a browser table: filterable on screen, awkward to pull into anything else. Two datasets, one schema:

  • Solicitations - open and historic bidding opportunities across every mayoral agency. About 12,000 records.
  • Contracts - awarded contracts with the vendor, amounts, dates, and the vendor's certification type and corporate structure. About 62,000 records.

Who uses this data

  • Gov-contracting BD teams and NYC vendors tracking new RFPs and bids by agency and industry, newest first, without watching the portal.
  • M/WBE firms tracking set-asides. Filter method to M/WBE and you get the noncompetitive small-purchase pipeline for your industry.
  • Prime contractors and sales teams researching who already holds a contract with a given agency, for how much, and until when.
  • Bid aggregators and govtech SaaS that need NYC coverage without maintaining a scraper against a portal that ships its data as a JavaScript blob.
  • Researchers, journalists and watchdogs studying award patterns, vendor concentration, or M/WBE participation over time.

What you get

One dataset item per record, newest first. Both modes share the same core fields, so you can pipe them into one table.

{
"source": "passport-public",
"mode": "solicitations",
"id": "38092",
"number": "85026B0100",
"title": "85026B0100-PWQMAHVAC Maspeth Town Hall HVAC Upgrade",
"agency": "DEPARTMENT OF DESIGN AND CONSTRUCTION",
"method": "Competitive Sealed Bid",
"category": "Construction",
"subCategory": "HVAC Services",
"status": "Planned",
"releaseDate": "2025-11-21T00:00:00-05:00",
"dueDate": "2026-08-27T14:00:00-04:00",
"url": "https://passport.cityofnewyork.us/page.aspx/en/bpm/process_manage_extranet/38092",
"program": "PUBLIC BUILDINGS",
"bpmId": "36592",
"scrapedAt": "2026-08-23T04:33:08.096Z"
}

Contract items add vendor, contractId, contractType, awardAmount, currentContractAmount, totalEncumberedAmount, totalPaidAmount, startDate, endDate, registrationDate, certificationType, ethnicity and corporateStructure. Amounts arrive as numbers, not "$3,749.95" strings. For contracts, releaseDate carries the start date and dueDate the end date.

With includeRaw, the raw object carries the source-derived columns under their portal names. They are source-derived rather than a byte copy: leading and trailing whitespace and the file's byte order mark are trimmed, and a title reassembled from an over-wide row may differ from the portal display. Use it to audit the normalization, not as a substitute for the portal record.

Dates are ISO 8601. Solicitation timestamps keep the published New York wall time with its offset (2026-08-27T14:00:00-04:00); contract rows publish no time of day, so they arrive as plain calendar dates (2026-08-27) rather than an invented midnight. Missing values are null, never an empty string. Records are deduplicated on id, keeping the later-dated copy, and ordered most recently published first, the same order the portal itself uses.

Input

Everything is optional. Run it with no input and you get the newest solicitations.

FieldTypeDefaultNotes
modeenumsolicitationssolicitations or contracts.
keywordstring-Case-insensitive substring across title, agency and record number.
agencystring-Case-insensitive substring on the agency name, e.g. PARKS.
methodstring-Case-insensitive substring on the procurement method, e.g. RFI, M/WBE, Sole Source.
categorystring-Case-insensitive substring on the industry category or the sub-category.
releasedAfterISO date-Solicitation release date, or contract registration date, on or after this.
dueAfterISO date-Solicitation due date, or contract end date, on or after this.
statusesstring[]-Exact, case-insensitive status match, e.g. ["Released", "Planned"].
maxResultsinteger10001 to 20000. This is your cost cap: you pay per delivered record.
includeRawbooleanfalseAttach a raw object with the source-derived columns (see the note above).

Example inputs

Open NYC RFPs and bids in your industry, due from today (BD alert):

{
"mode": "solicitations",
"category": "IT Related",
"statuses": ["Released"],
"dueAfter": "2026-08-23",
"maxResults": 200
}

M/WBE noncompetitive small purchase opportunities (certified M/WBE firms):

{
"mode": "solicitations",
"method": "M/WBE",
"dueAfter": "2026-08-23",
"maxResults": 500
}

Who holds contracts with one agency, and for how much (incumbent research):

{
"mode": "contracts",
"agency": "PARKS",
"releasedAfter": "2024-01-01",
"maxResults": 2000
}

Pricing

$0.01 per record; you pay only for records delivered. One charge per dataset item, nothing else. Set maxResults and you have set your bill: 100 records is $1.00. Filters are applied before delivery, so a narrow search costs less than a broad one.

Data source, refresh and terms

Records come from the City of New York's PASSPort Public portal, from the same data files the portal's own browse pages load:

  • Solicitations: https://a0333-passportpublic.nyc.gov/dataJs/rfxData.js (browse page: rfx.html)
  • Contracts: https://a0333-passportpublic.nyc.gov/dataJs/contractData.js (browse page: contracts.html)

Refresh: The city regenerates these files itself, typically once a day; each run reports the file's Last-Modified timestamp in the run summary under the OUTPUT key. Run the Actor on a schedule and you track the portal's own refresh. There is no faster feed available without a PASSPort vendor login.

Terms: Data is read from the City of New York's PASSPort Public portal, a public transparency site. This Actor is not affiliated with or endorsed by the City of New York. No login or account is involved in reading these files. Buyers are responsible for their own use of the data; see the City's terms of use. Field definitions and the City's own coverage caveats: PASSPort Public Data Info.

The Actor makes exactly one request per run for one file, sends a descriptive User-Agent, opens no parallel connections, and caches nothing between runs.

Limitations

  • PASSPort only, and only since January 2020. The city's disclaimer is explicit that this covers mayoral-agency procurement processed in PASSPort since the platform went live. It is not every NYC contract. For citywide spend, see Checkbook NYC.
  • No login-only content. Bid documents, addenda, attachments, Q&A, and award notices behind the vendor login are not included. Solicitation items link to the public record so you can open it yourself.
  • Contracts have no per-record deep link. The portal's contracts table does not publish one, so contract items link to the contracts browse page. Solicitation items get a real deep link.
  • Fields are as published. Blank cells in the source arrive as null; the city leaves category, registrationDate and certification fields empty on plenty of records. A small number of contract titles contain unescaped commas in the source and are reassembled before delivery; the run summary counts them.
  • The city's own test records are in the data. A handful of rows are internal tests (a "Public Hearing Test" contract starting in 2098). They are published data, so they are delivered rather than silently filtered.
  • Historic records are included by default. Use statuses or dueAfter to keep only live opportunities.

FAQ

How do I find open NYC government RFPs and bids?

Run in solicitations mode with statuses: ["Released"] and dueAfter set to today. Add category, agency or keyword to narrow to your industry. Every solicitation carries a deep link to its PASSPort Public record.

What is NYC PASSPort?

The City of New York's procurement and sourcing system. PASSPort Public is its transparency portal, which publishes solicitations and registered contracts for mayoral agencies since the platform went live in January 2020. This Actor reads the same data files the portal's browse pages load.

Can I see which vendors hold NYC city contracts?

Yes. contracts mode returns awarded contracts with vendor, awardAmount, currentContractAmount, totalEncumberedAmount, totalPaidAmount, start, end and registration dates, and the vendor's certification type and corporate structure.

How do I track NYC M/WBE contract opportunities?

Set method to M/WBE. The portal labels the M/WBE Noncompetitive Small Purchase method's solicitations as RFI (M/WBE), and the substring filter catches them.

How often is PASSPort Public data updated?

The city regenerates the files typically once a day. Each run reports the file's Last-Modified timestamp so you know which copy you received.

Does it include bid documents and addenda?

No. Those sit behind the PASSPort vendor login. Solicitation records carry the public deep link so you can open the record yourself.

Other datasets by the same author, all pay-per-record with source, refresh cadence and licence stated on each listing:

Nursing home and long-term care data

Medicare provider enrollment data

Public procurement and RFP feeds

Developer and AI test data