# Cancelled US Trademark Registrations, Weekly (USPTO Gazette) (`plainrecordlabs/cancelled-us-trademarks`) Actor

Each week's US trademark registrations the USPTO cancelled for a missed Section 8 or Section 71 filing, from the Trademark Official Gazette: mark, classes, goods, dates and business owner, plus a .com DNS hint. Not legal clearance. Unofficial tool.

- **URL**: https://apify.com/plainrecordlabs/cancelled-us-trademarks.md
- **Developed by:** [Plain Record Labs](https://apify.com/plainrecordlabs) (community)
- **Categories:** Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 cancelled registrations

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

## Cancelled US Trademark Registrations, Weekly (USPTO Gazette)

Get the US trademark registrations the USPTO cancelled each week, as clean rows. Every Tuesday the USPTO's Trademark
Official Gazette lists registrations it cancelled because the owner did not file the required declaration of use
(Section 8, or Section 71 for Madrid registrations). This Actor reads that list for one issue and returns one row per
cancelled registration: the mark, its classes and goods, its dates, the last owner when the owner is a business, a
link to check the current status at the USPTO, and a .com DNS hint for word marks.

> **A cancelled registration is not a free name.** The row says one registration was cancelled. It does not say
> the mark is unused or open to you. The owner may still use the name, may keep common law rights from that use, and
> may hold a newer live registration or a pending application for the same mark. This data is not legal clearance.
> Do a full trademark search and talk to a trademark attorney before you adopt any name from this list.
>
> The .com column is a DNS hint only. "not delegated" means no name servers answered for that .com name when the run
> asked. It does not mean the domain can be registered.
>
> This is an unofficial tool, not affiliated with the USPTO.

Press Start with the defaults to get 100 rows from the newest Gazette issue.

### What people use it for

- **Naming research:** see which registered marks in your classes lapsed this week, as a starting point for your own
  search.
- **Trademark watch and paralegal work:** a weekly table of cancellations to compare against a client's portfolio.
- **Market research:** count which classes and kinds of brands let their registrations lapse.

### How to use

1. Optional: set **Gazette issue date**. Leave it empty for the newest issue.
2. Optional: pick **Cancellation reasons**. Section 8 and Section 71 are on by default.
3. Optional: turn on **Word marks only**, set **Most words in the mark**, or add **International classes**, like `25`.
4. Set **Max results** to cap how many rows the run returns and what it costs.
5. Press Start. When the run ends, open the Output tab or download the results as CSV, Excel or JSON.
6. For a weekly list, add a schedule in Apify Console for Wednesday or later. The Gazette comes out on Tuesdays.

### Input

| Field | What it does |
|---|---|
| **Gazette issue date** | The Tuesday issue to read, like `2026-10-27`. Empty means the newest issue. |
| **Cancellation reasons** | Which cancelled lists to read. Section 8 and Section 71 by default. Sections 7(e), 18, 24 and 37 are also offered and are rare. |
| **Include partial cancellations** | A partial cancellation drops only some goods or classes, and the registration stays live for the rest. Off by default. |
| **Word marks only** | Only marks that are plain words. Leaves out logos and stylized marks. |
| **Most words in the mark** | Leaves out longer marks. 0 means no limit. |
| **International classes** | Only registrations in any of these Nice classes. Older registrations that list only US classes are left out when this is set. |
| **Add the .com DNS hint** | One public DNS query per word mark. On by default. |
| **Max results** | A cap on how many rows one run returns. 0 means no cap. |

### Output

One item per cancelled registration.

```json
{
  "status": "cancelled registration",
  "markText": "ALODINE",
  "wordMark": true,
  "markDrawingType": "TYPESET WORD(S) /LETTER(S) /NUMBER(S)",
  "markType": "Trademark",
  "registrationNumber": "420005",
  "serialNumber": "71485322",
  "registrationDate": "1946-03-19",
  "filingDate": "1945-07-02",
  "gazetteIssueDate": "2026-10-27",
  "cancellationSection": "Section 8",
  "partialCancellation": false,
  "internationalClasses": [],
  "usClasses": ["6"],
  "goodsServices": [{ "classNumber": "6", "classType": "US", "description": "CHEMICAL COMPOSITION USED IN PRODUCING AN ADHERENT COATING UPON ALUMINUM AND ALLOYS OF ALUMINUM" }],
  "markDescription": null,
  "ownerName": "HENKEL AG & CO. KGAA",
  "ownerAddress": "HENKELSTRASSE 67 DÜSSELDORF DE GERMANY 40589",
  "ownerEntityType": "PARTNERSHIP LIMITED BY SHARES",
  "ownerWithheld": false,
  "owners": [{ "name": "HENKEL AG & CO. KGAA", "address": "HENKELSTRASSE 67 DÜSSELDORF DE GERMANY 40589", "entityType": "PARTNERSHIP LIMITED BY SHARES", "withheld": false }],
  "comDomain": "alodine.com",
  "comDns": "delegated",
  "tsdrUrl": "https://tsdr.uspto.gov/#caseNumber=71485322&caseType=SERIAL_NO&searchType=statusSearch",
  "source": "USPTO Trademark Official Gazette, tmog.uspto.gov"
}
```

Notes on the fields:

- `ownerName` and `ownerAddress` are split by the Actor from the one owner line the Gazette prints. The split is a
  best guess and can be wrong for unusual names. A named contact person in a business line, after "Attn" or "c/o",
  is cut out.
- `ownerWithheld` is true when any owner is a person. See the next section.
- `comDns` is `delegated`, `not delegated` or `lookup failed`, and it is empty for logos and stylized marks.
- `tsdrUrl` opens the registration in the USPTO's status system, where you can see the full record and any newer
  filings by the same owner.
- Text is cleaned up where the source stored it with broken characters, like `COLT’S` and `DÜSSELDORF`.

The run's key-value store also has a `SUMMARY` record with the issue read, how many registrations it listed and how
many were returned.

### Owners who are people

When the owner is an individual, a sole proprietorship or another kind of person, the row keeps the mark and the
registration details but leaves out the owner's name, address and the mark description. `ownerWithheld` is true and
`ownerEntityType` says what kind of owner it was. A partnership whose name is only the partners' own names, an owner
listed as a person trading under a business name (a DBA), and an owner of unknown type whose name has no company form
like LLC or GmbH, are left out too. That rule also blanks a few small businesses that use a DBA. In the 4,101 rows of
the 2026-10-27 issue with default settings, 814 were withheld this way.

### What it does not do

- It does not say a name is free, unused or safe to adopt. It lists registrations the USPTO cancelled.
- It does not search for newer registrations, pending applications or common law use of the same mark.
- It does not check whether a .com domain can be bought. It makes one DNS query and reports the answer.
- It does not list registrations that are coming up for renewal.
- It covers US federal registrations only, as listed in the Gazette.

### Pricing

You pay per cancelled registration returned, plus a small start fee per run:

| Apify plan | Per 1,000 registrations |
|---|---|
| All plans | 2.00 USD |

The start fee is 0.0005 USD a run. A full weekly issue with Section 8 and Section 71 is about 4,000 to 4,500 rows.
**Max results** and Apify's maximum cost per run setting both cap the bill. A run that stops at your cost limit
returns only the rows it charged for.

### Data source and limits

- The data comes from the USPTO's electronic Trademark Official Gazette at tmog.uspto.gov, through the same public
  search the site uses. No login or key is used. Thanks to the USPTO for publishing it.
- The Actor reads 200 rows a page with a short pause between pages, so a full issue takes a few minutes.
- If the USPTO refuses a request, the run stops and says so. It does not retry around a refusal.
- The Gazette is the USPTO's notice of the cancellation. Later corrections can change a registration's status, so
  check `tsdrUrl` before you rely on a row.

### Support

Questions or a wrong result? Open an issue on the Issues tab and we will look into it.

Thanks,
Plain Record Labs

# Actor input Schema

## `issueDate` (type: `string`):

The Tuesday Trademark Official Gazette issue to read, YYYY-MM-DD, for example 2026-10-27. Leave empty for the newest issue, which is what a weekly schedule wants.

## `reasons` (type: `array`):

Which cancelled lists to read. Section 8 and Section 71 are registrations cancelled because the owner did not file the required declaration of use. The others are rare.

## `includePartial` (type: `boolean`):

A partial cancellation drops only some goods or classes and the registration stays live for the rest. Off by default.

## `wordMarksOnly` (type: `boolean`):

Only typeset and standard character marks, the ones that are plain words. Leaves out logos and stylized marks.

## `maxMarkWords` (type: `integer`):

Leave out marks with more words than this, for example 2 for short names. 0 = no limit.

## `internationalClasses` (type: `array`):

Only registrations in any of these Nice classes, 1 to 45, for example 25 for clothing or 9 for software. Older registrations that list only US classes are left out when this is set.

## `checkComDns` (type: `boolean`):

For each word mark, one public DNS query for name servers on the matching .com name. A hint only, not a check that the domain can be registered.

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

Most registrations one run returns. 0 = no cap. A weekly issue lists about 4,000 to 4,500 Section 8 and Section 71 cancellations.

## Actor input object example

```json
{
  "reasons": [
    "CANCELLED_SECTION_8",
    "CANCELLED_SECTION_71"
  ],
  "includePartial": false,
  "wordMarksOnly": false,
  "maxMarkWords": 0,
  "internationalClasses": [],
  "checkComDns": true,
  "maxResults": 100
}
```

# Actor output Schema

## `registrations` (type: `string`):

One item per cancelled registration listed in the Gazette issue.

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

The Gazette issue read, how many registrations it listed and how many were returned.

# 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 = {
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("plainrecordlabs/cancelled-us-trademarks").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 = { "maxResults": 100 }

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

```

## MCP server setup

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

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/ayAWa3tl2VC7MHlw4/builds/Vhfu5w91uAoUC3qtK/openapi.json
