# Government Bids & Contract Awards Feed: NYC & Cook County (`quaky_ozone/public-bids-awards-feed`) Actor

New NYC solicitations, intents to award, proposed awards and contract awards from the official City Record, plus Cook County intents to execute. Agency, amount, due date and vendor firm; no contact names, phones or e-mails.

- **URL**: https://apify.com/quaky_ozone/public-bids-awards-feed.md
- **Developed by:** [Z J](https://apify.com/quaky_ozone) (community)
- **Categories:** Lead generation, Business
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Government Bids & Contract Awards Feed: NYC City Record & Cook County

Get new **NYC government bids (RFPs and solicitations), intents to award, proposed contract awards and contract awards** from the official *City Record Online*, plus **Cook County, Illinois intents to execute**, pulled from each government's official open-data portal. Each row gives the agency, title, due date, contract amount and, on awards, the vendor company. No contact names, phone numbers or e-mail addresses are returned. Notices whose vendor cannot be proven to be a single organisation are withheld entirely (see Privacy).

### What you get

| Field | Meaning |
|---|---|
| `postedDate`, `source`, `noticeType` | Publication date; `NYC` or `Cook County`; `solicitation`, `intent_to_award`, `award`, `proposed_award` (NYC public comment on a contract award) or `intent_to_execute` (Cook County). A rare NYC notice type outside these is `other` |
| `agency`, `title`, `category`, `selectionMethod` | The buying agency or department, the notice title (up to 300 characters; blank when it fails the privacy filter below) and, for NYC, the category and procurement method as published |
| `dueDate` | Response due date (NYC solicitations and intents to award; awards have none) |
| `contractAmount` | Contract amount in US dollars, when published |
| `vendorName`, `vendorAddress` | The awarded or recommended vendor company and, for NYC, its street address (blank when it fails the address filter in Privacy). Null when the notice has no vendor (solicitations, most proposed awards) |
| `procurementId` | NYC PIN (or the City Record request id when a notice has no PIN), or the Cook County contract number |
| `documentLinks` | Link to the notice documents when the City Record publishes one and it passes the same filter as titles (rare in recent data); otherwise use `sourceUrl` |
| `changeType` | `new`, or `changed` when a notice you already received changed due date, amount, vendor or title |
| `sourceDataset`, `sourceUrl`, `sourceFreshness`, `retrievedAt` | Where the row came from, the newest posting date that source had, and when you pulled it |

### Who it's for

- **B2B vendors and contractors** bidding on New York City and Cook County work: a daily list of open solicitations with due dates.
- **Subcontractors and suppliers** chasing the companies that just won city contracts.
- **Market-intelligence and GovTech teams** tracking public contract awards by agency, category and amount.

### Input

| Field | Default | Notes |
|---|---|---|
| `sources` | both | `NYC`, `Cook County` |
| `noticeTypes` | all | Any of the `noticeType` values above |
| `daysBack` | 14 | 1-90, counted back from today |
| `sinceDate` | none | `YYYY-MM-DD`; overrides `daysBack` (never more than 90 days back) |
| `agencyContains` | none | e.g. `Transportation`, `CLERK` |
| `keywords` | none | Up to 20 words; a notice is kept when its title contains any of them as a whole word, e.g. `software`, `IT` |
| `minAmount` | 0 | Keep only notices with a published amount at least this large; above 0, notices without an amount are dropped |
| `openOnly` | `false` | Keep only notices whose due date is today or later (drops awards, which have no due date) |
| `onlyNewSinceLastRun` | `true` | See "Repeat runs" below |
| `maxItems` | 500 | 1-5,000, newest first |

Daily feed of open NYC bids:

```json
{ "sources": ["NYC"], "noticeTypes": ["solicitation", "intent_to_award"], "daysBack": 7, "openOnly": true }
```

Contract awards over $1 million, both governments:

```json
{ "noticeTypes": ["award", "intent_to_execute"], "daysBack": 30, "minAmount": 1000000 }
```

IT and software notices:

```json
{ "keywords": ["software", "IT", "cloud", "network"], "daysBack": 30 }
```

### Output example

Values below are illustrative. Rows 2 and 3 are abridged; every real row has all the keys shown in row 1.

```json
[
  { "postedDate": "2026-10-19", "source": "NYC", "noticeType": "award", "agency": "Example Agency", "title": "Ongoing electrical maintenance service",
    "category": "Services (other than human services)", "selectionMethod": "M/WBE Noncompetitive Small Purchase", "dueDate": null,
    "contractAmount": 460000, "vendorName": "EXAMPLE ELECTRICAL CONTRACTOR INC", "vendorAddress": "1 Example Boulevard",
    "procurementId": "26026W0000001", "documentLinks": null, "changeType": "new", "sourceDataset": "dg92-zbpx",
    "sourceUrl": "https://data.cityofnewyork.us/resource/dg92-zbpx.json?request_id=20261000001",
    "sourceFreshness": "2026-10-19", "retrievedAt": "2026-10-19T12:00:00+00:00" },
  { "postedDate": "2026-10-19", "source": "NYC", "noticeType": "solicitation", "agency": "Example Authority",
    "title": "IT software subscription and hardware maintenance", "selectionMethod": "Competitive Sealed Proposals", "dueDate": "2026-11-05",
    "contractAmount": null, "vendorName": null, "procurementId": "EX-2701P", "changeType": "new", "sourceDataset": "dg92-zbpx" },
  { "postedDate": "2026-09-25", "source": "Cook County", "noticeType": "intent_to_execute", "agency": "1110.COUNTY CLERK",
    "title": "Kiosks installation at satellite offices", "contractAmount": 145037, "vendorName": "EXAMPLE KIOSKS, INC",
    "procurementId": "2610-00001", "changeType": "new", "sourceDataset": "ag43-fvd7",
    "sourceUrl": "https://datacatalog.cookcountyil.gov/resource/ag43-fvd7.json?contract_number=2610-00001" }
]
```

### Pricing

Pay per result: **$0.002 per notice row** ($2.00 per 1,000 rows), charged once per row returned. Apify also charges its standard actor-start event (default $0.00005, i.e. $0.05 per 1,000 runs) once per run. You are never charged for the run summary or for errors; those go to the run's key-value store (`OUTPUT`), not the dataset. A run stops cleanly when it reaches the spending limit you set.

**Repeat runs.** With `onlyNewSinceLastRun` on (the default), the actor remembers which notices this exact input already returned, in a storage that stays in your account, and only returns notices that are new or changed (changed means the source edited that same notice in place, for example a corrected amount or due date; a notice the agency re-posts on a later date comes back as new and is charged again). A solicitation and its later award are different notices, so each is returned once. The memory forgets a notice it has not seen for 45 days (or 3 × `daysBack`, if longer), so `sinceDate` runs spaced further apart than that return and charge those notices again as new. Rows are only deduplicated between runs that follow one another: two runs of the same input that overlap in time, or a run interrupted after it delivered rows but before it saved its memory, can return and charge some rows again.

Free-plan users can try it within Apify's monthly free usage credit.

### Freshness and volume, stated honestly

| Source | Source cadence | What that means |
|---|---|---|
| NYC City Record Online | Daily | Notices appear on their publication date. In a live check on 2026-10-19, 14 days held 185 notices; about 158 were returned after the privacy rules below (about 65 awards, 60 proposed awards, 25 solicitations, 8 intents to award) |
| Cook County intents to execute | As needed | Posted irregularly: in the same check, the last 90 days held 4 notices and the last 14 days none |

Each run's `OUTPUT` record lists every source's status, row count and newest posting date; one source failing never stops the other. For a daily schedule, `daysBack` of about 7 with changes-only mode costs nothing for the overlap.

### Data sources, license and attribution

- **NYC City Record Online**, dataset `dg92-zbpx` on data.cityofnewyork.us, attributed to the Department of Citywide Administrative Services (DCAS). Dataset license: Public Domain. NYC Administrative Code §23-502(d) makes public data sets available "without any registration requirement, license requirement or restrictions on their use", and the City may require a third party to identify the source and version and describe modifications. The City Record is the City's official journal; open `sourceUrl` (or `documentLinks` when present) for the full notice.
- **Cook County Procurement - Intent to Execute**, dataset `ag43-fvd7` on datacatalog.cookcountyil.gov, attributed to the Office of the Chief Procurement Officer. Dataset license: Public Domain.
- **Source and version:** every row names its source record in `sourceUrl` (dataset id and record id), and `retrievedAt` is the version pulled.
- **Modifications made here:** only a narrow set of columns is read; notice types are normalised; dates are cut to `YYYY-MM-DD`; amounts are converted to numbers; titles are cut to 300 characters; notices whose vendor is not proven to be a single organisation are removed; titles, links and vendor addresses that fail the privacy filters are blanked; columns are renamed.
- Not affiliated with or endorsed by the City of New York, DCAS or Cook County. The data is provided as published, without warranty; neither government is liable for its completeness or accuracy.

Only the official Socrata open-data API is used, one request at a time with more than a second between requests. A typical run makes two requests.

### Privacy

- Contact names, phone numbers, fax numbers and e-mail addresses are never requested. NYC free-text description and "other information" fields are never downloaded either, because they often name agency staff and their e-mail addresses. Cook County MBE/WBE/DBE participation fields (ownership demographics) are never downloaded.
- **Rows that cannot be proven to be about an organisation are withheld.** A vendor is returned only when the whole published name is one organisation with positive proof. Anything else withholds the **whole notice**, not just the name, because a sole proprietor's business address is a person's address. Names are never split or trimmed to publish part of them. The check is an allowlist:
  - The last word must be a legal form (LLC, INC, CORP, LTD, LIMITED, LP, LLP, LLLP, PLLC, PC, FSB, CO, N.A.), COMPANY, CORPORATION, INCORPORATED, FOUNDATION, ASSOCIATION or AUTHORITY, or BANK in a recognised bank name. No legal form may appear earlier; a word such as COMPANY may sit only just before the closing legal form.
  - Characters: plain (unaccented) letters, digits, spaces, "&", comma, dot, apostrophe and hyphen, nothing else. A dot or hyphen only inside a word; an apostrophe only inside a word or after a final S ("Residents'"); "&" only with spaces on both sides ("A & B") or glued to a single letter or digit ("AT\&T"); a comma only before the closing legal form ("Acme, Inc."); fewer than 7 digits in all; no dotted abbreviation of two or more letters followed by another word ("St. James") and no word glued to another by a dot ("Example.com").
  - Withheld words and shapes: two separate single letters in a row; CO or NA anywhere but last; a hyphen joining two words; " x " or " versus "; the joiners dba, aka, fka, t/a, obo, c/o, with, via and executor/trustee abbreviations in any spelling (split, dotted, spaced, hyphenated, or glued with "&" or an apostrophe, so "d b a", "D.Ba", "D\&B\&A", "C.O.", "T-A", "O Bo", "W ITH"); joining words such as by, per, for, or, JV, owner, operating, trading, representing, "on behalf", "known as", "care of", attn; titles (Mr, Mrs, Dr, Esq, MD, Rev, Hon, Prof, Sir); officer and capacity words (President, CEO, Member, Manager, Agent, Officer, Partner, Successor, Individually, Guardian, Custodian, Nominee); trust and estate words and abbreviations (Trust, Trustee, TR, TRS, TST, Estate, EST, Heirs, Etal, Etux, Admr, Executor, Living, Family, Revocable). A name joined by "and" or "&" is withheld when a part looks like a person's name.
  - Accepted limits: a plain-text name that strings a person and a firm together without any marker (for example a person's name followed directly by a company name, or joined by an ordinary word such as "of" or "at") cannot be told apart from a registered business name, so it is returned. A registered company can also carry its founder's name (for example "Jane Doe, P.C." or "Jane Doe LLC"), and such companies are returned with their address.
- This is deliberately strict. It also withholds some real companies, for example ones without a legal form in the name, joint ventures written "X / Y", names with brackets, accents, a trade name or a web address ("Example.com, Inc."), names whose legal form is not last ("Bank of America"), and names with an abbreviation like "St. James", a hyphenated word ("Coca-Cola") or a word that is also on the withheld list ("TA Construction LLC", "Itineris NA, Inc."). On the vendor names seen in NYC and Cook County data, about two in three are returned. Notices with no vendor at all (solicitations and most proposed awards) are unaffected.
- `vendorAddress` is returned only with a returned vendor, and is blanked when it names a recipient (Attn, Attention, c/o, care of), contains "@", or holds 7 or more digits in a row once punctuation is removed (phone-shaped; a ZIP+4 code and a house number before a numbered street such as "133-49 123rd Street" do not count). A small company's address can be a home address; it is published as the company's address of record.
- Titles and document links are free text. They are blanked when, after Unicode normalisation, they contain any character outside plain ASCII, an "@" or a spelled-out e-mail ("at ... dot", "\[at]", "{at}", "<at>", "%40", or "at" followed by a host name such as "agency.gov"), 7 or more digits once spaces and punctuation are removed (phone-number shaped; this also blanks some titles with large dollar amounts, dates or long reference numbers), or a common first name. A title that contains a job-role word (analyst, developer, engineer, manager, consultant and similar) and ends in a separated two- or three-word name, as staff-augmentation awards often do ("Data Modeler - First Last"), is also blanked; this blanks a few titles that end in a role phrase. A surname alone, or a first name that is not on the common-name list, is not detected. The rest of the notice is still returned.
- Any cell containing an e-mail address is blanked.
- No scraping of web pages, no skip tracing and no contact enrichment.

### Use with AI agents (MCP)

Limited permissions, exactly one charge per returned row plus the tiny per-run start event, and a fixed column set described by the dataset schema, so agents can call it through the Apify MCP server and budget exactly.

### FAQ

**Why is an award I can see on the City Record missing?** Its vendor could not be proven to be one organisation (for example 'EXAMPLE COMMUNITY SERVICES' with no legal form, a joint venture written with a slash, or a name with a trade name or brackets), so the whole notice was withheld. The test errs toward withholding: it loses some real companies rather than ever returning a private person's name or address. In a 14-day live check on 2026-10-19, about 27 of 93 NYC notices with a vendor (about three in ten) were withheld this way.

**Why is `vendorName` blank?** The notice has no vendor: solicitations and most proposed awards name only the agency.

**Where is the full notice text?** It stays at the source: open `sourceUrl`, or search the City Record Online with the `procurementId`.

**How do I export CSV or Excel?** Open the run's dataset and choose the format, or call the dataset items API with `format=csv`.

### Related actors

- New Business Filings by State: Daily LLC & Corporation Feed (No Personal Data)
- UCC Lien Filings Feed: New Liens by State (Entity-only)
- NYC LLC & Corporate Property Deals: ACRIS Deeds with Parcel Data

# Actor input Schema

## `sources` (type: `array`):

Notice sources to read.

## `noticeTypes` (type: `array`):

Keep only these notice types. Empty keeps all.

## `daysBack` (type: `integer`):

Posting-date window counted back from today.

## `sinceDate` (type: `string`):

Optional start date (YYYY-MM-DD); overrides Days back (never more than 90 days back).

## `agencyContains` (type: `string`):

Keep only notices whose agency or department contains this text, e.g. Transportation.

## `keywords` (type: `array`):

Keep only notices whose title contains any of these words (case-insensitive).

## `minAmount` (type: `integer`):

Keep only notices with a published contract amount at least this large. 0 keeps all, including notices without an amount.

## `openOnly` (type: `boolean`):

Keep only notices whose due date is today or later. Notices without a due date (awards) are dropped.

## `onlyNewSinceLastRun` (type: `boolean`):

Remembers what this input already returned and skips it, so scheduled runs never pay twice for the same notice.

## `maxItems` (type: `integer`):

Upper bound on rows returned (newest first).

## Actor input object example

```json
{
  "sources": [
    "NYC",
    "Cook County"
  ],
  "noticeTypes": [
    "solicitation",
    "award"
  ],
  "daysBack": 7,
  "minAmount": 0,
  "openOnly": false,
  "onlyNewSinceLastRun": true,
  "maxItems": 200
}
```

# Actor output Schema

## `results` (type: `string`):

One row per public notice, in the Overview column order.

## `summary` (type: `string`):

Per-source status, freshness, row counts and stop reason (never charged).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "sources": [
        "NYC",
        "Cook County"
    ],
    "noticeTypes": [
        "solicitation",
        "award"
    ],
    "daysBack": 7,
    "onlyNewSinceLastRun": true,
    "maxItems": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("quaky_ozone/public-bids-awards-feed").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "sources": [
        "NYC",
        "Cook County",
    ],
    "noticeTypes": [
        "solicitation",
        "award",
    ],
    "daysBack": 7,
    "onlyNewSinceLastRun": True,
    "maxItems": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("quaky_ozone/public-bids-awards-feed").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sources": [
    "NYC",
    "Cook County"
  ],
  "noticeTypes": [
    "solicitation",
    "award"
  ],
  "daysBack": 7,
  "onlyNewSinceLastRun": true,
  "maxItems": 200
}' |
apify call quaky_ozone/public-bids-awards-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,quaky_ozone/public-bids-awards-feed"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/stkimHKEXh97ju0Bp/builds/KX1hjGaHF931OX2Ou/openapi.json
