# Cybercab DMV Watch (`mikee368/cybercab-dmv-watch`) Actor

Daily US DMV and AV-permit tracking of Tesla Cybercab (TX, CA, WA, NY, CO, NM, MN, OR, VT, CT) plus Tesla Robotaxi permits (NV; AZ best-effort, often blocked). NM, MN, OR, VT, and CT are monthly or quarterly counts only. No owner or personal data (DPPA).

- **URL**: https://apify.com/mikee368/cybercab-dmv-watch.md
- **Developed by:** [Mike Berckmoes](https://apify.com/mikee368) (community)
- **Categories:** Automation, News, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.012 / daily report

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

Daily US DMV and autonomous-vehicle permit tracking for the **Tesla Cybercab** (VIN pattern `5YJAJEEU*TA` or model `CYBERCAB`) in **Texas, California, Washington, New York, Colorado, New Mexico, Minnesota, Oregon, Vermont, and Connecticut**, plus **Tesla Robotaxi** company permits in **Nevada** and, best-effort, **Arizona**. One run writes **vehicle and company facts only**. It does not collect owner names, addresses, license plates, cities, ZIP codes, or counties.

You pay **$0.012** once per run for the `daily-report` event. That price covers every state in the run. Hits are not charged.

### What does Cybercab DMV Watch do?

**Cybercab DMV Watch** reads public US sources and writes the state, record type, model, VIN or VIN pattern, date, and source URL, plus a **running total** for each state. New York registration VINs stay in the named key-value store `cybercab-dmv-watch-ny`. The dataset gets the masked pattern and the count. Arizona and Nevada rows are company permits, not people.

Sources, checked 11 Oct 2026:

- [Texas AV roster](https://txmccs.txdmv.gov/api/TruckStop/companies/81edcff1-8a6e-4ed0-be1f-60668515e223/automated-motor-vehicles) for Tesla Robotaxi, LLC (commercial list, not personal titles). Cybercab is VIN `5YJAJEEU*TA`. Model Y on this roster is VIN `7SAYGDEE*TF`. Program page: [Texas DMV AV program](https://www.txdmv.gov/AVprogram).
- [California AV testing permit holders](https://www.dmv.ca.gov/portal/vehicle-industry-services/autonomous-vehicles/autonomous-vehicle-testing-permit-holders/), California DMV.
- [Washington electric vehicle population](https://data.wa.gov/resource/f6w7-q2d2.json), Washington State Department of Licensing via data.wa.gov. Open Data Commons ODbL. This Actor stores counts and new-hit facts, not the population file.
- [New York vehicle registrations](https://data.ny.gov/resource/w4pv-hbkt.json) (SODA filter only; the bulk file is not downloaded). OPEN-NY terms: reuse, no attribution required, no share-alike.
- [Colorado Atlas EV registrations](https://www.atlasevhub.com/public/dmv/CO_EV_Registrations_10_2026.csv), Colorado Energy Office data published by Atlas Public Policy (Atlas EV Hub). Open Data Commons ODbL. This Actor stores the Cybercab count and the file date, not the CSV.
- [New Mexico](https://www.atlasevhub.com/public/dmv/NM_EV_Registrations_07_2026.csv), [Minnesota](https://www.atlasevhub.com/public/dmv/MN_EV_Registrations_10_2026.csv), [Vermont](https://www.atlasevhub.com/public/dmv/VT_EV_Registrations_01.csv), and [Connecticut](https://www.atlasevhub.com/public/dmv/CT_EV_Registrations_12.csv) Atlas EV registration files. Same columns as Colorado (model and count, no VIN). Open Data Commons ODbL. Counts only. New Mexico updates monthly. Minnesota and Vermont update quarterly. Connecticut updates about twice a year.
- [Oregon ODOE / ODOT electric vehicle workbook](https://www.oregon.gov/energy/data-and-reports/Documents/ODOT-EV-Data.xlsx). Make and model, no VIN. The latest snapshot column is counted. City, ZIP, county, and tract columns are dropped and are not stored. Updates monthly or quarterly. Oregon's terms are "as is."
- [Arizona TNC valid permits](https://apps.azdot.gov/files/mvd/vehicle-for-hire/vfh-valid-permits-tnc.pdf) for company **53880**, TESLA ROBOTAXI LLC. The list is behind Cloudflare. This Actor sends one polite User-Agent and, if the response is still a challenge, records Arizona `ok` false and continues. It does not solve a captcha or open a browser. The PDF is not stored.
- [Nevada NTA certificate](https://nta.nv.gov/uploadedFiles/ntanvgov/content/Carriers/Certificates/T_to_Z/Tesla_Robotaxi_LLC_AVNC_002-cert_ADA.pdf) for Tesla Robotaxi LLC. The watch stores Last-Modified and a SHA-256 of the file, and flags a new row when that interim 10-vehicle certificate is replaced (for example by a 5,000-vehicle permit). The 5 June confidentiality notice is not requested. Names printed on the certificate are not stored.

### Why use Cybercab DMV Watch?

A saved key-value store remembers what the last run already saw, so the dataset stays limited to **new hits** (`new` true) and the current totals. Scheduling, storage, and the run API are the Apify pieces. There is no login, no captcha solving, and no browser.

Washington `robots.txt` allows `/resource/` with crawl-delay 1. New York uses the same rule. California `robots.txt` disallows `/portal/wp-admin/` and `/portal/wp-content/uploads/`; the permit page is allowed. Colorado `robots.txt` allows `/public/dmv/`. Texas site policies forbid damage and unauthorized uploads; this Actor only GETs the published roster. Nevada `robots.txt` disallows `/workarea/` and `/widgets/`; the certificate path is outside those prefixes. Arizona's `robots.txt` was a Cloudflare challenge on 11 Oct 2026, so this Actor does not crawl the site: one GET of the permit PDF.

### What data can Cybercab DMV Watch extract?

| Field | What it is |
| --- | --- |
| `state` | TX, CA, WA, NY, CO, AZ, NV, NM, MN, OR, VT, or CT |
| `record_type` | `av_permit` (Texas), `company_permit` (California, Arizona, Nevada), or `registration` |
| `model` | `CYBERCAB`, `MODEL Y`, or `unknown`. Texas splits the two. A company permit is `unknown`. Statewide EV files count Cybercab only, because a Model Y row there is a consumer registration |
| `vin` | A Texas fleet VIN, or a pattern (`5YJAJEEU*TA` Cybercab, `7SAYGDEE*TF` Texas Model Y, or `5YJAJEEU*` for Washington's 10-character VIN) |
| `date` | Source date. Colorado, New Mexico, Minnesota, Vermont, Connecticut, and Oregon use the file `Last-Modified` date. Texas has no publication date, so the date is the UTC run date |
| `snapshot` | Latest DMV snapshot label from an Atlas CSV, or the Oregon snapshot date (`YYYY-MM-DD`) from the latest monthly column |
| `source_url` | The public URL that was read |
| `total` | Running count for that state |
| `new` | True only for a hit that was not in the previous run |
| `row_type` | `hit` or `total` |
| `permit_type` | California: `testing_with_driver`, `driverless_testing`, and/or `deployment`. Arizona: `valid` (or `expired`, `suspended`, `revoked`, `cancelled` when the row says so). Nevada: `interim_10` while the certificate is the 10-vehicle interim, or `vehicles_5000` when a replacement states a cap of 5,000 or more |
| `permit_id` | `53880` for Arizona, or `AVNC-002` for the Nevada certificate |
| `vehicle_cap` | Nevada fleet cap stated on the certificate, such as 10 or 5000 |
| `content_sha256` | SHA-256 of the Nevada certificate. A new hash is a replacement of the document |

`row_type` `total` is written on every successful state. `row_type` `hit` is written only when something new appeared.

### How to run Cybercab DMV Watch

1. Open **Cybercab DMV Watch** and leave **States** at Texas and Nevada, or add any of the other ten codes.
2. Run it once. The first run treats the current Texas fleet, a positive count, and the current California permit as new.
3. Schedule it daily. A useful clock is 18:00 America/Los_Angeles, cron `0 18 * * *`, timezone `America/Los_Angeles`.
4. Read the dataset. Filter `new` true for alerts and `row_type` total for the current counts.
5. Optional: set the secret environment variable `DISCORD_WEBHOOK_URL`. With no webhook, the run does not call Discord. New hits still post one alert. Each run also keeps a single weekly table (state by Cybercab and Model Y, Monday-Sunday weeks in Europe/Amsterdam, count and week-over-week change, for example `319 (+4.2%)`). The first post stores the message id and a hash of the table. Later runs edit that message only when the text changed. If the edit is missing, one new message is posted. Past weeks are rebuilt from earlier runs only while no week rows are saved; after that the Actor updates the saved weeks and does not list older runs. A week with no saved count is `-`.

Use 256 MB and a 900 second timeout. A full run takes about **9 minutes** when Colorado is the only large download, and longer on a day when the other count files also change. Texas is one paged fetch of the TxDMV roster (100 rows per page; the roster rejects a larger page). Cybercab and Model Y are counted from those same pages. When a page response included an ETag or Last-Modified, the next run sends it, and a 304 does not download that page again. Colorado is one streamed download of about 740 MB. New Mexico, Minnesota, Vermont, and Connecticut are smaller Atlas CSVs. Oregon is one workbook of about 29 MB. Each of those files is a conditional GET (`If-None-Match` when an ETag was saved, and `If-Modified-Since`). When the file is unchanged the server returns 304 and the body is not downloaded. When it changes, a CSV is streamed one row at a time. Only the latest DMV snapshot is counted. These five states update monthly or quarterly and the Actor stores the Cybercab count and the snapshot date only. If one of them fails, `sourceOk` for that state is false and the run still finishes. Arizona and Nevada are one small PDF each. Arizona is a single polite GET: a Cloudflare 403 sets `sourceOk.AZ` to false in `RUN_SUMMARY` and does not fail the run. Nevada flags a hit when Last-Modified or the content hash changes, including when the interim 10-vehicle certificate is replaced.

### How much does Cybercab DMV Watch cost?

Pricing is pay per event. The only live event is **`daily-report` at $0.012**, charged **once per run**. It covers every state you selected. There is no per-hit and no per-vehicle charge. A quiet day and a day with many new Cybercabs cost the same $0.012.

Platform compute for a 256 MB run of about 9 minutes is separate from that event price on the developer's side. You are billed the event.

#### Planned pricing

Not active. A future event **`new-cybercab-hit`** would charge for each new Cybercab. It is documented only. It is not in the live price list and the Actor does not charge it.

If it is turned on later, it needs a **per-run cap** so a day with 1,000 new Cybercabs cannot multiply the bill. For example, charge at most 50 `new-cybercab-hit` events in one run, or set the run's `maxTotalChargeUsd` to $0.10. The run would stop at the cap instead of billing one event per vehicle. Until that exists, ignore this note. The price you pay today is `daily-report` only.

### Input

See the input tab. `states` chooses the sources. The form starts with Texas and Nevada; add any other state code to include it. `texasPageSize` is the Texas roster page size (default 100, maximum 100). `resetState` clears `cybercab-dmv-watch-state` and `cybercab-dmv-watch-ny`. Leave `resetState` off for a normal daily run. A run whose platform timeout is about five minutes stops before that timeout and still exits successfully. A longer run checks every selected state.

### Output

You can download the dataset in JSON, CSV, or Excel.

```json
{
  "state": "TX",
  "record_type": "av_permit",
  "model": "CYBERCAB",
  "vin": "5YJAJEEU*TA",
  "date": "2026-10-11",
  "source_url": "https://txmccs.txdmv.gov/api/TruckStop/companies/81edcff1-8a6e-4ed0-be1f-60668515e223/automated-motor-vehicles",
  "total": 319,
  "new": false,
  "row_type": "total"
}
```

A California change looks like this:

```json
{
  "state": "CA",
  "record_type": "company_permit",
  "model": "unknown",
  "vin": null,
  "date": "2026-09-17",
  "source_url": "https://www.dmv.ca.gov/portal/vehicle-industry-services/autonomous-vehicles/autonomous-vehicle-testing-permit-holders/",
  "total": 1,
  "new": true,
  "row_type": "hit",
  "permit_type": "testing_with_driver"
}
```

The default key-value store holds `RUN_SUMMARY` (counts only, plus `sourceOk` for Arizona, Nevada, and the five count states, and `chargedEvent` `daily-report`). New York VINs are not in the dataset and not in that summary. A blocked Arizona fetch or a failed count state looks like `"sourceOk": {"AZ": false}` or `"sourceOk": {"NM": false}` and the run status stays ok when the other requested states succeeded.

```json
{
  "state": "NV",
  "record_type": "company_permit",
  "model": "unknown",
  "vin": null,
  "date": "2026-08-12",
  "source_url": "https://nta.nv.gov/uploadedFiles/ntanvgov/content/Carriers/Certificates/T_to_Z/Tesla_Robotaxi_LLC_AVNC_002-cert_ADA.pdf",
  "total": 1,
  "new": true,
  "row_type": "hit",
  "permit_type": "interim_10",
  "permit_id": "AVNC-002",
  "vehicle_cap": 10
}
```

### Tips

Keep the run at 256 MB and give it 900 seconds. The Colorado file is why a full run takes about 9 minutes. Do not point this Actor at a login page. If one state fails, the others still finish and the failed state's saved total is left as it was.

### FAQ, disclaimers, and support

This Actor reads public pages and open-data APIs with a polite User-Agent. It does not extract private user data such as an email address, a home address, a plate, or a city. The US Driver's Privacy Protection Act (DPPA) restricts personal information in motor vehicle records. This Actor collects vehicle and company-permit facts only: no owner, no address, no plate, no city, no ZIP. Names printed on a certificate are not stored. New York's full VINs, if a future file contains matches, stay in a private key-value store. Personal data is protected by the GDPR in the European Union and by other laws. Do not republish a personal-data field.

Washington and the Atlas registration files (Colorado, New Mexico, Minnesota, Vermont, and Connecticut) are under the Open Data Commons ODbL. Attribute data.wa.gov (Washington State Department of Licensing) and Atlas EV Hub when you reuse those counts. The bulk files are not copied into the dataset. Oregon city, ZIP, county, and tract values are not stored. Arizona's disclaimer says documents may be copyrighted and the state keeps distribution rights, so the PDF itself is not stored: only company 53880, its status, and the date.

Questions can go to the Issues tab. The API tab runs it from your own code.

# Actor input Schema

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

State codes to check. TX is the Texas AV roster, CA is the California company permit page, WA and NY are SODA counts, CO, NM, MN, VT, and CT are Atlas EV registration CSVs, OR is the Oregon ODOE workbook (counts only), AZ is Arizona TNC permit 53880, and NV is the Nevada Robotaxi certificate. Unknown codes are ignored. The form starts with Texas and Nevada. Add any of the other codes to check them too.

## `texasPageSize` (type: `integer`):

How many Texas AV roster rows to request per page. The roster rejects a page above 100. The Actor walks every page and keeps Cybercab rows only.

## `resetState` (type: `boolean`):

Forget the named key-value store cybercab-dmv-watch-state and the private New York VIN store cybercab-dmv-watch-ny. The next run treats every current hit as new.

## Actor input object example

```json
{
  "states": [
    "TX",
    "NV"
  ],
  "texasPageSize": 100,
  "resetState": false
}
```

# Actor output Schema

## `overview` (type: `string`):

New hits (new=true) and per-state totals

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

Status and the current count for each state. No VINs.

# 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 = {
    "states": [
        "TX",
        "NV"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mikee368/cybercab-dmv-watch").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 = { "states": [
        "TX",
        "NV",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("mikee368/cybercab-dmv-watch").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 '{
  "states": [
    "TX",
    "NV"
  ]
}' |
apify call mikee368/cybercab-dmv-watch --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mikee368/cybercab-dmv-watch"
        }
    }
}
```

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/Ri2yTcmA0FAdfb2yf/builds/AX6bhJjSOhtVJHnuz/openapi.json
