# UCC Filings & Liens - CT, CO, OR + NYC/NY (`j0401/us-liens`) Actor

UCC filing records, farm-product liens and tax warrants from eleven public registers in Connecticut, Colorado, Oregon and New York. One schema; filter by debtor, secured party, filing number, status, county or date. Filing-level and company-screen modes; derived status.

- **URL**: https://apify.com/j0401/us-liens.md
- **Developed by:** [Wenhao Yang](https://apify.com/j0401) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.03 / 1,000 us lien records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## UCC Filing Records - CT, CO, OR + NYC/NY Liens

UCC financing statements, farm-product liens and tax warrants from eleven public registers in Connecticut, Colorado, Oregon and New York. One schema across all of them: look up a debtor, a secured party or a filing number, pull one row per filing, screen a company name, or watch for new filings.

### Low cost

**From $0.00005 per record, down to $0.00003 at Gold.**

### What you get

Every record carries the same keys, whichever register it came from:

- `corpus`, `jurisdiction`, `state` - which register and where
- `recordKind` - `debtor`, `secured_party`, `party`, `collateral`, `filing`, `document` or `warrant`
- `lienType` - `farm_products` on the two farm registers, the register's own label elsewhere
- `filingNumber`, `originalFilingNumber`, `filingType`, `filingDate`, `lapseDate`
- `debtorName`, `securedPartyName`
- `status` - **derived** into `active` / `lapsed` / `terminated` / `satisfied` / `unknown`
- `statusRaw` - the register's own word, always preserved
- `amount`, `address`, `city`, `stateCode`, `zip`
- `collateral`, `collateralCount`, `product`, `county`, `partyRole`
- `sourceUrl`, `sourceUpdatedAt`

Every record also carries `debtorNames[]`, `securedPartyNames[]` and `debtorCount`; outside `mode=filings` those are empty, because the record is one party row rather than a filing - except `co-farm`, where one row already lists the additional debtors. Colorado publishes the debtor, secured-party and collateral sides as separate tables: a `mode=filings` record from `co` or `co-farm` carries the debtor names, while `co-secured`, `co-collateral` and `co-filing` filing keys carry no party names themselves (the sides are separate registers, `co` and `co-secured`).

### Registers

| `corpus` | Register | Rows | `recordKind` |
|---|---|---:|---|
| `ct` | Connecticut UCC filing index | ~849,600 debtor rows / ~438,100 filings | debtor |
| `co` | Colorado UCC debtor register | ~2,024,500 debtor rows / ~1,606,600 filings | debtor |
| `co-collateral` | Colorado UCC collateral | ~1,711,500 rows | collateral |
| `co-secured` | Colorado UCC secured parties | ~2,095,100 rows | secured_party |
| `co-filing` | Colorado UCC filing information | 2,606,100 transactions | filing |
| `co-farm` | Colorado farm-products EFS | 54,246 rows / 5,164 filings | debtor |
| `or` | Oregon UCC secured parties | ~220,000 rows / ~214,900 filings | secured_party |
| `or-farm` | Oregon farm-products master list | 124,703 rows / 8,130 filings | debtor / secured_party |
| `or-filings` | Oregon UCC entered last month | 5,990 rows (rolling window) | debtor / secured_party |
| `nyc-acris` | NYC ACRIS personal property | ~4,553,000 documents | document / debtor |
| `ny` | New York State tax warrants | ~698,800 since 2025-07-01 | warrant |

### Modes

`mode=rows` (default) returns one record per source row.

`mode=filings` collapses rows onto the filing number and returns **one row per filing** - `debtorNames[]`, `securedPartyNames[]`, `debtorCount`. Use it when the filing, not the party row, is what you are buying. Connecticut's ~849,600 debtor rows collapse to ~438,100 filings. `maxResults` in this mode counts **filings delivered**, not source rows; the arrays hold the party rows retrieved for those filings (a second pass, capped at 5,000 source rows).

`mode=monitor` returns only records filed after the last run for the same Apify user, and advances a per-user, per-register watermark stored in the actor's key-value store. The watermark is a **row-level cursor on the oldest date delivered in the batch**, so a page that spans several dates cannot skip the older ones; already-delivered rows are remembered by a row key (filing + party + status), not just by filing number, so a filing that names several debtors is not truncated to its first row. The cursor remembers up to 20,000 delivered row keys. Owner runs do not advance the watermark unless `sinceLastRun=true`. If a single date holds more undelivered rows than one page can traverse, the run fails with a clear message rather than returning nothing forever - use `mode=rows` with `dateFrom`/`dateTo` for that window.

`mode=company` requires `name` and `state` (CT, CO, OR or NY) and screens every register of that state for party names that start with the query. Each record says `matchType`: `exact` or `prefix`. This is **not** entity resolution - see the limits below.

### Examples

```json
{ "corpus": "ct", "debtor": "SMITH", "maxResults": 100 }
```

```json
{ "corpus": "co", "filingNumber": "2609784" }
```

```json
{ "corpus": "co-collateral", "filingNumber": "2610622", "maxResults": 20 }
```

```json
{ "corpus": "co-secured", "securedParty": "WELLS FARGO", "maxResults": 100 }
```

```json
{ "corpus": "co-filing", "filingType": "lien_irs", "maxResults": 100 }
```

```json
{ "corpus": "co-farm", "debtor": "SMITH", "maxResults": 100 }
```

```json
{ "corpus": "or", "securedParty": "WELLS FARGO", "maxResults": 100 }
```

```json
{ "corpus": "or-farm", "securedParty": "FARM SERVICE AGENCY", "maxResults": 100 }
```

```json
{ "corpus": "or-filings", "lienType": "UCC", "maxResults": 100 }
```

```json
{ "corpus": "nyc-acris", "debtor": "SMITH", "maxResults": 100 }
```

```json
{ "corpus": "ny", "status": "Added", "city": "BUFFALO", "maxResults": 100 }
```

```json
{ "mode": "filings", "corpus": "co", "debtor": "SMITH", "maxResults": 50 }
```

```json
{ "mode": "monitor", "corpus": "co-filing", "maxResults": 100 }
```

```json
{ "mode": "company", "name": "SMITH", "state": "CO", "maxResults": 50 }
```

### Colorado collateral coverage

Colorado publishes collateral on a separate table. Measured 2026-10-23:

- **1,377,087 of 1,606,615 Colorado filings (~86%) have at least one collateral row.**
- **1,376,807 filings (~86%) have at least one readable description.** Colorado writes the literal text `UNKNOWN` when a filer left the field blank (945,489 rows, 55%); that placeholder is normalised to an empty `collateral` and is not counted.
- `collateral` shows up to three distinct descriptions joined by `|`; `collateralCount` counts the distinct descriptions retrieved for that filing (the join fetches a bounded page per filing, so a filing with an unusually long collateral list can report fewer than it has).
- `corpus=co` joins the collateral and filing tables onto each debtor row by `fileId`, so a Colorado debtor record carries its filing date, lapse date and collateral without a second call.

`corpus=co-filing` is the transaction view: Initial Filing, Amendment, Filing Officer Correction and Correction, with `fileid` as the join key to the debtor, collateral and secured-party tables.

### Derived status

`status` is computed from the register's own fields; `statusRaw` keeps the original word. An unrecognised combination is `unknown` - never guessed.

| `corpus` | Raw -> `status` |
|---|---|
| `ct` | `Active` -> active (lapsed if `lapseDate` is past) / `Released` -> satisfied / `Terminated` -> terminated |
| `co`, `co-secured`, `co-collateral` | `active` -> active (lapsed if `lapseDate` is past) / `inactive` -> terminated when the action is a delete, otherwise unknown / a termination transaction on the filing -> terminated |
| `co-filing` | `terminationflag=true` -> terminated / `lapseDate` past -> lapsed / otherwise active |
| `co-farm` | effective financing statement -> active (the register carries no status word and no lapse date, so `statusRaw` is empty) |
| `or` | `IRS-X` -> satisfied / `lapseDate` past -> lapsed / known lien code (UCC / EFS / IRS / CW / RW / TU / PF / ASL / APL) -> active / anything else -> unknown |
| `or-farm` | `lapseDate` past -> lapsed / known farm code (EFS / ASL / APL) -> active / anything else -> unknown |
| `or-filings` | `IRS-X` -> satisfied / `lapseDate` past -> lapsed / known lien code -> active / anything else -> unknown |
| `ny` | satisfaction date -> satisfied / vacate date -> terminated / `Added` / `Updated` -> active / `Closed` with neither date -> unknown |
| `nyc-acris` | `TERM` -> terminated / `RLSE` -> satisfied / good-through date past -> lapsed / `INIT` / `INIC` / `UCC1` / `FL` / `FTL` / `CONT` / `AMND` / `ASGN` / `RFL` / `UCC3` / `SUBO` -> active |

Status **filters** accept the source word or the derived word where the register can answer it; anything else is rejected with a clear error rather than silently ignored.

### Which fields each register fills

| corpus | debtorName | securedPartyName | filingDate | lapseDate | amount | collateral | derived status |
|---|---|---|---|---|---|---|---|
| ct | yes | yes | yes | yes | - | - | yes |
| co | yes | - | via `co-filing` | via `co-filing` | - | via `co-collateral` | yes |
| co-collateral | - | - | via `co-filing` | via `co-filing` | - | yes | yes |
| co-secured | - | yes | via `co-filing` | via `co-filing` | - | - | yes |
| co-filing | - | - | yes | yes | - | - | yes |
| co-farm | yes | yes | yes | - | - | product / crop | yes |
| or | - | yes | yes | yes | - | - | yes |
| or-farm | debtor rows | secured-party rows | yes | yes | - | product / crop | yes |
| or-filings | debtor rows | secured-party rows | yes | yes | - | - | yes |
| nyc-acris | name screens only | - | yes | yes | often `0` | yes | yes |
| ny | yes | - | yes | sparse (~11%) | yes | - | yes |

### Honest limits

- **A row is not always a filing.** Connecticut and Colorado publish one row per **debtor**; Colorado collateral is one row per collateral entry; Oregon UCC is one row per **secured party**; New York publishes one row per **warrant status record** (a warrant can appear on several rows as its status changes); ACRIS is **document-level**. `recordKind` tells you which. Use `mode=filings` for one row per filing.
- **Oregon UCC has no debtor name.** `corpus=or` indexes the lender side, so `debtor` is rejected there rather than silently ignored. The Oregon farm and last-month registers carry both sides.
- **`corpus=or-filings` is a rolling one-month window, not history.** The publisher replaces it each month; a filing absent from it is not "no filing", only outside the snapshot. Use `corpus=or` for the current Oregon register.
- **Colorado's debtor table has no date column.** `co` and the two Colorado detail tables obtain filing and lapse dates by joining `fileid` against the filing-information table, so a date filter resolves through that table first. The window is resolved against the newest 6,000 filings in it, then the detail rows are read with every other filter applied server-side; a window holding more than 6,000 filings is therefore sampled (raise `maxResults` for more of the same window, but not beyond that ceiling).
- **NYC ACRIS debtor screens are prefix-match only.** The parties table is 11 million rows and a leading-wildcard search times out at the source.
- **`mode=company` is a name screen, not entity resolution.** It matches the start of a party name in one state's registers and deliberately does not merge records, assert that two same-named parties are one legal entity, or carry identifiers across registers. A common name such as `SMITH` will return unrelated people and businesses; treat `matchType` and the filing number as the facts. Each register contributes at most 500 prefix matches, so a very broad name is sampled per register rather than exhaustively paged.
- **New York's warrant feed is windowed** from 2025-07-01 (~699,000 rows), and one warrant can appear on several rows as its status changes.
- **`lienType` is not a national taxonomy.** The farm registers use `farm_products`; every other register keeps its own label.
- Filters a register cannot honour are rejected with a clear error - none are dropped.
- Each register has its own integrity guard; a register that structurally changes or collapses fails the run instead of returning empty rows.

### Related

Also available in this account: **NYC ACRIS** (document lookups with parties) and **NYC Tax Lien Sale Lists**.

# Actor input Schema

## `mode` (type: `string`):

rows = one record per source row. filings = one record per filing (debtorNames\[], securedPartyNames\[], debtorCount). monitor = only records newer than your last run. company = name screen across the registers of one state.

## `corpus` (type: `string`):

Blank = ct in rows/filings/monitor mode, and the state's registers in company mode. ct / co / or / ny / nyc-acris are UCC and lien registers; co-collateral, co-secured, co-filing, co-farm, or-farm and or-filings are the Colorado and Oregon detail registers.

## `name` (type: `string`):

mode=company only, required there. Prefix match (exact matches are tagged exact). This is a name screen, NOT entity resolution.

## `debtor` (type: `string`):

Debtor name search. Not available for corpus=or (lender-side register only) or the Colorado collateral / filing tables.

## `securedParty` (type: `string`):

Lender / secured-party name search. Available for ct, co-secured, or, or-farm, or-filings and co-farm.

## `filingNumber` (type: `string`):

Exact filing / file / warrant id. Available for ct, co, co-collateral, co-secured, co-filing, co-farm, or, or-farm, or-filings and ny.

## `status` (type: `string`):

The register's own word (Active, Released, Added, Closed, active, inactive ...), or a derived word where the register can answer it cleanly (active / lapsed / terminated / satisfied). Each record also carries the derived `status` and the raw `statusRaw`. A word the register cannot filter on is rejected.

## `lienType` (type: `string`):

Source lien code. or: UCC / EFS / IRS / IRS-X / CW / RW / TU / PF / ASL / APL. or-farm: EFS / ASL / APL. or-filings: same set as or.

## `filingType` (type: `string`):

co-filing: ucc / lien_irs / lien_hosp / efs / lien_othr_stat / ...; or-filings: INITIAL / AMENDMENT.

## `transactionType` (type: `string`):

co-filing only: Initial Filing / Amendment / Filing Officer Correction / Correction.

## `county` (type: `string`):

co-collateral, co-farm, or-farm.

## `farmProduct` (type: `boolean`):

co-collateral only: keep collateral flagged as farm products.

## `city` (type: `string`):

City prefix. Available for ct, co, co-secured, or, or-farm, or-filings and ny.

## `state` (type: `string`):

Two-letter address state for the row filters. In mode=company this is the jurisdiction to screen and is required: CT, CO, OR or NY.

## `dateFrom` (type: `string`):

ISO date. Filing/recording date; available on every register. co, co-collateral and co-secured resolve the window through Colorado's filing-information table first.

## `dateTo` (type: `string`):

ISO date. See dateFrom.

## `borough` (type: `string`):

NYC borough code or name (nyc-acris only).

## `docType` (type: `string`):

ACRIS document type code, e.g. UCC1, FTL, TERM (nyc-acris only).

## `sinceLastRun` (type: `boolean`):

Owner runs only: read and advance the monitor watermark. User runs in monitor mode always do.

## `maxResults` (type: `integer`):

Cap on records delivered (0 = default 50; up to 2,000 per run). Each delivered record is metered individually, so there is no per-run charge cap.

## Actor input object example

```json
{
  "mode": "rows",
  "corpus": "",
  "farmProduct": false,
  "sinceLastRun": false,
  "maxResults": 50
}
```

# Actor output Schema

## `recordsUrl` (type: `string`):

US lien records - as JSON

## `datasetUrl` (type: `string`):

No description

## `runUrl` (type: `string`):

No description

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("j0401/us-liens").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("j0401/us-liens").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 '{}' |
apify call j0401/us-liens --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,j0401/us-liens"
        }
    }
}
```

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/4dM5KPG55QtOVE2Q6/builds/WizqXW0luxerCHNmB/openapi.json
