# UCC Lien Monitor — NY, FL, CO New Filings, No Login (`chimerical_quicklime/ucc-lien-monitor`) Actor

Watch debtors (and secured parties in CO) across New York, Florida and Colorado UCC records and get only NEW lien filings and status changes since the last run: filing number, type, dates, lapse, secured parties. Daily schedule. No login. MCP-ready. $20 per 1,000 alerts.

- **URL**: https://apify.com/chimerical\_quicklime/ucc-lien-monitor.md
- **Developed by:** [Khrystyna Skotte](https://apify.com/chimerical_quicklime) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 filing alerts

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

## UCC Lien Monitor — new filings against watched debtors (NY, FL, CO)

Schedule this actor daily and it emits **only what is new**: UCC-1 / UCC-3 filings recorded against the
debtors you watch, or filed by the secured parties you watch, across several state registries. It keeps a
seen-state per monitor ID, so a filing is reported once, and it can POST each run's alerts to a webhook.

No login, no paid subscription, no API key. Pay-per-event: $0.005 per run + $0.02 per alert ($20 per 1,000).

### Who uses it

- **Lenders and factoring companies** — know within a day when another creditor files against a borrower or
  client (a new UCC-1 on your collateral, or an amendment/continuation on a competing lien).
- **Credit and risk teams** — watch portfolio debtors for new secured debt before the next review.
- **Equipment lessors and brokers** — track filings by competitors in Colorado (secured-party watch).
- **Law firms and search companies** — replace manual daily re-searches of the state portals.

### State coverage

| State | Source | Debtor watch | Secured-party watch | Detail data | Notes |
|---|---|---|---|---|---|
| NY | NY Department of State online UCC search (`ucc-efiling.dos.ny.gov`) | begins-with, organization names | no (portal has no secured-party search) | lien type, status, lapse date, debtor address, secured parties | Cloudflare-gated: needs US residential proxy (default). Filing date filter applied server-side. |
| FL | floridaucc.com public search API | begins-with, organization names | no (API has no secured-party search) | document type, file date, expiration, secured parties, status Filed/Lapsed | No proxy needed. List rows carry no date, so each unseen filing costs one detail call (capped at 60 per name per run). |
| CO | Colorado Secretary of State UCC advanced search (`sos.state.co.us/ucc`) | standard search logic (normalized legal name) | **yes** | document #, date, debtor, secured party, type, original record #, lapse date | Cloudflare-gated: needs US residential proxy (default). Filing date filter applied server-side. Record images are PDF only, so no address/collateral. |

Individual-debtor (last/first name) searches, collateral text and filing images are not emitted by any state.

#### States checked and skipped (as of 2026-09-28)

| State | Why not |
|---|---|
| CA (bizfileonline.sos.ca.gov) | Imperva/Incapsula challenge on the page and the JSON API from every IP tried. |
| IL (apps.ilsos.gov/uccsearch) | Search is a form POST; the portal is unreachable from our test network, so it could not be verified end-to-end. |
| OH (ucc.ohiosos.gov) | Portal returns 403 "Website Maintenance" from all networks tried. |
| WA (fortress.wa.gov/dol/ucc) | Multi-step ASP.NET wizard gated by reCAPTCHA v3 (server returned 500 without a token). |
| MI (ucc.michigan.gov) | Search API (`cpapi.ucc.michigan.gov`) requires an authenticated customer-portal session (401). |
| TX (SOSDirect), DE, GA (GSCCCA) | Paid, login-only searches. |

### Input

| Field | Default | Meaning |
|---|---|---|
| `debtorNames` | `["VERIZON", "AMAZON", "CARNIVAL"]` | Organization debtor names to watch. NY/FL: every debtor whose name starts with the text. CO: the registry's standard search logic (use the full legal name). |
| `securedPartyNames` | `[]` | Secured party names to watch (CO only; NY/FL log a skip). |
| `states` | `["NY", "FL"]` | Any of `NY`, `FL`, `CO`. |
| `lookbackDays` | `30` | Only filings dated inside this window count as new. Older unseen filings are recorded silently. |
| `maxNewPerWatch` | `5` | Cap per name per state per run; the rest come out on the next run. |
| `includeDetails` | `true` | Open each new filing for secured parties / lien type (NY, FL). |
| `firstRunMode` | `emitAll` | `emitAll` emits everything inside the lookback on the first run; `baseline` records everything and emits nothing, so the next run reports only what changed. |
| `webhookUrl` | `""` | POST target for the run summary + first 50 alerts. |
| `monitorId` | `default` | Separate seen-state per ID (key-value store `ucc-monitor-<hash>`). |
| `maxItems` | `10` | Overall cap per run. |
| `proxyConfiguration` | US residential | Needed for NY and CO. |

### Output

One record per change:

```json
{
  "state": "NY",
  "filingNumber": "20260911121947-3",
  "filingType": "UCC Lien",
  "filingDate": "2026-09-11",
  "lapseDate": "2031-09-11",
  "status": "Active",
  "debtorName": "Verizon Corporate Services Group Inc.",
  "debtorAddress": "ONE VERIZON WAY, BASKING RIDGE, NJ, 07920, USA",
  "securedParties": [{ "name": "Wilmington Trust Company, ...", "address": "1100 NORTH MARKET STREET, WILMINGTON, DE, 19890, USA" }],
  "collateral": null,
  "originalFilingNumber": null,
  "detailUrl": "https://ucc-efiling.dos.ny.gov/OnlineUCCSearch/OnlineLienInformation?lienId=...",
  "matchedWatch": "debtor:VERIZON",
  "changeType": "new_filing",
  "previousStatus": null,
  "firstSeenAt": "2026-09-29T00:24:08.127Z",
  "monitorId": "default"
}
```

`changeType` is `new_filing` or `status_change` (NY: Active → Lapsed/Released…; FL: Filed → Lapsed).
Colorado rows have no status, so only `new_filing` is emitted there; UCC-3 amendments appear as their own
rows with `originalFilingNumber` pointing at the UCC-1. Florida has no deep link per filing: open
`detailUrl` (the public search) and look the `filingNumber` up as a document number.

### Recommended setup

1. Run once with `firstRunMode: "baseline"` and your real watchlist, so the current filings are recorded.
2. Schedule the same input daily (Apify Schedules). Each run costs a few cents and emits only new activity.
3. Add a `webhookUrl` (Slack, Zapier, Make, your API) to get alerts pushed; the dataset keeps the history.
4. Use one `monitorId` per portfolio to keep seen-states apart.

The seen-state is capped at 50,000 filings per monitor; the oldest entries are dropped beyond that.

# Actor input Schema

## `debtorNames` (type: `array`):

Organization debtor names. NY and FL match every debtor whose name starts with the text (VERIZON finds VERIZON WIRELESS); CO applies its standard search logic (the normalized legal name, so use the full name). One row is emitted per NEW filing against each name.

## `securedPartyNames` (type: `array`):

Emit new filings FILED BY these lenders/lessors (competitor or portfolio tracking). Only Colorado offers a secured-party search; NY and FL skip these watches with a log line.

## `states` (type: `array`):

Which registries to query: NY (Department of State), FL (floridaucc.com), CO (Secretary of State). Others are ignored with a warning.

## `lookbackDays` (type: `integer`):

Only filings dated within this many days count as new. Older filings the monitor has not seen yet are recorded silently so they never surface later. For a daily schedule 7-30 days is plenty; the seen-state prevents duplicates.

## `maxNewPerWatch` (type: `integer`):

Stop after emitting this many changes for one name in one state. Filings beyond the cap stay unseen and come out on the next run.

## `includeDetails` (type: `boolean`):

Open each new filing's detail record to add secured parties, lien type and addresses (NY, FL). Florida rows carry no filing date, so FL details are always fetched. Colorado's list already includes the secured party.

## `firstRunMode` (type: `string`):

What to do when this monitor ID has no saved state yet. emitAll: emit every filing inside the lookback window (one-off pull or first test). baseline: silently record everything currently on file and emit nothing, so the next scheduled run reports only what is new since.

## `webhookUrl` (type: `string`):

Optional. After each run a JSON summary {monitorId, runAt, newFilings, statusChanges, filings\[first 50]} is POSTed here (Slack/Zapier/Make/your API).

## `monitorId` (type: `string`):

Name of this watchlist. Each ID keeps its own seen-state in a key-value store named ucc-monitor-<hash>, so several portfolios can run side by side.

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

Overall cap on emitted records per run. Changes beyond it stay unseen and come out on the next run.

## `proxyConfiguration` (type: `object`):

The NY and CO portals sit behind Cloudflare and reject datacenter IPs, so keep US residential proxies for those states. Florida's API needs no proxy.

## Actor input object example

```json
{
  "debtorNames": [
    "VERIZON",
    "AMAZON",
    "CARNIVAL"
  ],
  "securedPartyNames": [],
  "states": [
    "NY",
    "FL"
  ],
  "lookbackDays": 30,
  "maxNewPerWatch": 5,
  "includeDetails": true,
  "firstRunMode": "emitAll",
  "webhookUrl": "",
  "monitorId": "default",
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `records` (type: `string`):

Dataset of new UCC filings and status changes found in this run (JSON).

# 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 = {
    "debtorNames": [
        "VERIZON",
        "AMAZON",
        "CARNIVAL"
    ],
    "states": [
        "NY",
        "FL"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("chimerical_quicklime/ucc-lien-monitor").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 = {
    "debtorNames": [
        "VERIZON",
        "AMAZON",
        "CARNIVAL",
    ],
    "states": [
        "NY",
        "FL",
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("chimerical_quicklime/ucc-lien-monitor").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 '{
  "debtorNames": [
    "VERIZON",
    "AMAZON",
    "CARNIVAL"
  ],
  "states": [
    "NY",
    "FL"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call chimerical_quicklime/ucc-lien-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,chimerical_quicklime/ucc-lien-monitor"
        }
    }
}
```

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/9gCp2h9ZXI2fhe4xG/builds/I57Z30hgcw4eFVgHj/openapi.json
