# USPTO Trademark Status Scraper - Classes & Owner (`punkrecordsdata/uspto-trademark-status-scraper`) Actor

Look up USPTO trademark status by serial or registration number: mark details, registered classes, owner and attorney of record. Real-time, official public data. Export to CSV, JSON, Excel, or XML.

- **URL**: https://apify.com/punkrecordsdata/uspto-trademark-status-scraper.md
- **Developed by:** [PunkRecordsData](https://apify.com/punkrecordsdata) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 trademark 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

<p align="center">
  <img src="https://api.apify.com/v2/key-value-stores/AAm3a1h3Z9nYfrvh9/records/banner" alt="PunkRecordsData" width="100%" />
</p>

## ®️ USPTO Trademark Status Scraper - Classes & Owner

> 🚀 **Look up real USPTO trademark status in seconds.** Get mark details, registered classes, owner, attorney of record, and the full prosecution history by serial or registration number. Export to CSV, JSON, Excel, or XML.

The **USPTO Trademark Status Scraper** looks up official trademark records from the [United States Patent and Trademark Office](https://tsdr.uspto.gov). Give it a serial or registration number and get mark details, every registered class, the owner, the attorney of record, and the complete file wrapper history back, structured and ready to use.

Most trademark lookup tools on the market return one flat status check. This actor reads the full record the USPTO publishes per mark, including classes a single mark can register across multiple product/service categories, in one call.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Trademark attorneys & paralegals | Bulk-check status across a client portfolio |
| Startup founders | Verify a name is safe to use before launch |
| Brand protection teams | Monitor competitor filings and ownership |
| Compliance & KYB teams | Verify a company's registered trademarks |

### 📋 What the USPTO Trademark Status Scraper does

> 💡 **Why it matters:** a trademark can register in several classes at once (a mark used for both "real estate services" and "parking services," for example), each with its own class status. Most scrapers of this data return one flattened row and lose that structure. This one keeps it.

Give it a list of serial numbers or registration numbers, and it looks up each one's official status page, extracting the mark, filing/status dates, every registered class, the owner, and the attorney of record.

### 📊 Output

Each record contains:

| Field | Description |
|---|---|
| `mark` | The trademark's literal text |
| `serialNumber` | USPTO serial number |
| `registrationNumber` | USPTO registration number, if registered |
| `filingDate` | Application filing date |
| `register` | Principal or Supplemental |
| `markType` | e.g. Service Mark, Trademark |
| `status` | Current status, in the USPTO's own words |
| `statusDate` | Date of the current status |
| `url` | Source page URL |
| `for` *(class rows)* | Goods/services description for one registered class |
| `internationalClasses` / `usClasses` / `classStatus` *(class rows)* | Class codes and status |
| `ownerName` / `ownerAddress` / `legalEntityType` *(owner rows)* | Owner details |
| `attorneyName` / `correspondentName` *(attorney rows)* | Attorney/correspondent of record |
| `docId` / `description` / `displayDate` / `pageCount` / `downloadUrls` *(document rows)* | One prosecution-history document (application, office actions, notice of allowance, publication, abandonment, etc.) |

**Example output** (real trademark, real data, 2026-09-19):

```json
{
  "mark": "SEEK BEAUTY",
  "serialNumber": "88888888",
  "registrationNumber": "N/A",
  "filingDate": "Apr. 27, 2020",
  "register": "Principal",
  "markType": "Service Mark",
  "status": "Abandoned because no Statement of Use or Extension Request timely filed after Notice of Allowance was issued.",
  "statusDate": "Dec. 12, 2022",
  "url": "https://tsdr.uspto.gov/statusview/sn88888888",
  "scrapedAt": "2026-09-19T20:38:15.890Z"
}
```

### ✨ Why choose this Actor

- **5 real billable events**, mark status, classes, owner, attorney, and full prosecution history, each optional. Most competing USPTO trademark scrapers charge one flat price for one generic status check.
- **Every registered class, not just the first one.** A mark with multiple classes returns one row per class, each with its own status.
- **Official, real-time data**, sourced directly from the USPTO's own public status system, no third-party aggregator delay.
- **Works by serial or registration number**, covers both pending applications and registered marks.

### 🚀 How to use

1. **Create a free Apify account** at [console.apify.com/sign-up](https://console.apify.com/sign-up), you get $5 credit monthly.
2. **Open the USPTO Trademark Status Scraper** in Apify Console.
3. **Add serial or registration numbers**, e.g. `88888888` or `rn4671942`.
4. **Set max items**, how many trademarks to look up (free tier caps at 10).
5. **Toggle the extras you need**, Classes, Owner, Attorney & correspondent, Prosecution history documents, each is billed only when enabled.
6. **Click Start**, results appear in the Output tab within minutes.
7. **Download** as JSON, CSV, Excel, or XML.

### 💼 Business use cases

#### Portfolio monitoring

Attorneys and brand teams can bulk-check the status of every mark in a client's or competitor's portfolio in one run.

#### Pre-launch name clearance

Founders can verify whether a proposed brand name has existing registrations before committing to it.

#### KYB and compliance

Verify a company's registered trademarks as part of a broader business verification workflow.

#### Ownership research

Pull the owner and attorney of record for competitive intelligence or licensing outreach.

#### Prosecution history review

Pull the full file wrapper history, every office action, response, and status change, for litigation prep or due diligence.

### 🔌 Automating USPTO Trademark Status Scraper

- **Make.com / Zapier**, Schedule status checks and push results to Google Sheets
- **Slack**, Get notified when a tracked mark's status changes
- **Airbyte**, Feed trademark data into your data warehouse
- **GitHub Actions**, Automate lookups on a cron schedule

### 🌟 Beyond business use cases

- **Academic research**, study trademark filing and abandonment patterns
- **Journalism**, verify ownership claims behind a brand name
- **Personal projects**, check the status of your own pending application

### 🤖 Ask an AI assistant about this scraper

Ask questions about how to use this scraper, what data it extracts, or how to integrate it with your workflow. The AI assistant has full context about the actor's capabilities.

### ❓ Frequently Asked Questions

#### Can I search by trademark name instead of a number?

Not currently. USPTO's name-search interface is protected by a bot-detection challenge; this actor uses the official public status lookup by serial or registration number, the same surface most reliable USPTO tools use.

#### How do I find a trademark's serial or registration number?

Search the mark's name on the USPTO's own [Trademark Search](https://tmsearch.uspto.gov) tool once to find the number, then use this actor for bulk, repeatable lookups.

#### Why does a trademark sometimes return multiple class rows?

A single mark can register across several International/U.S. classes at once (for example, both real estate and parking services). Each class has its own status, tracked separately.

#### How does pricing work?

The base `trademark-record` event bills per lookup. Enable Classes, Owner, Attorney & correspondent, and/or Prosecution history documents for additional data at extra per-event cost. Free users get 10 lookups per run.

#### What is in the prosecution history?

The complete file wrapper for the case: the original application, drawing, every office action and response, the notice of allowance, publication confirmations, and the final disposition (registration or abandonment), each as its own row with a description, date, and download link.

#### Is this data official?

Yes, it comes directly from the USPTO's own public Trademark Status & Document Retrieval (TSDR) system.

#### What happens if I hit the free tier limit?

The actor caps output at 10 items for free users. Upgrade to a paid plan for up to 1,000,000 items.

#### Can I schedule recurring lookups?

Yes, use Apify's Scheduler to re-check a portfolio's status daily, weekly, or on any cron schedule.

#### What does "abandoned" or "registered" status mean?

The actor returns the USPTO's own status text verbatim, exactly as published on the official record.

### 🔌 Integrate with any app

The actor outputs JSON datasets that work with virtually any tool: Google Sheets, Airtable, Notion, databases (PostgreSQL, MongoDB), data pipelines (Airbyte, Fivetran), and more. Use the Apify API to pull data programmatically.

### 🔗 Recommended Actors

- [Sports Reference Stats Scraper](https://apify.com/punkrecordsdata/sports-reference-stats-scraper), NBA & NHL player and team stats
- [SEC EDGAR Filings Scraper](https://apify.com/punkrecordsdata/sec-edgar-filings-scraper), SEC filings, insider transactions, financial facts
- [Prediction Markets Scraper](https://apify.com/punkrecordsdata/prediction-markets-scraper), Kalshi & Polymarket odds

> 💡 **Pro Tip:** browse the complete [PunkRecordsData collection](https://apify.com/punkrecordsdata).

**🆘 Need Help?** contact.punkrecordsdata@gmail.com

> **⚠️ Disclaimer:** independent tool, not affiliated with the USPTO; only publicly available data.

# Actor input Schema

## `numbers` (type: `array`):

USPTO trademark serial numbers (e.g. 88888888) or registration numbers. Prefix with 'rn' for a registration number, otherwise treated as a serial number.

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

Free users: limited to 10 items (preview). Paid users: optional, max 1,000,000. Bounds the primary trademark-record event only.

## `includeClasses` (type: `boolean`):

One row per registered International/U.S. class (a mark can hold more than one).

## `includeOwner` (type: `boolean`):

Owner name, address, and legal entity type.

## `includeAttorney` (type: `boolean`):

Attorney of record and correspondent contact info.

## `includeDocuments` (type: `boolean`):

Full file wrapper history, one row per document (application, office actions, notice of allowance, publication, abandonment, etc.), with description, date, page count and download links.

## Actor input object example

```json
{
  "numbers": [
    "88888888"
  ],
  "maxItems": 10,
  "includeClasses": false,
  "includeOwner": false,
  "includeAttorney": false,
  "includeDocuments": false
}
```

# Actor output Schema

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

Key fields: mark, serial/registration number, status

## `fullData` (type: `string`):

Complete dataset including classes, owner and attorney rows

# 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 = {
    "numbers": [
        "88888888"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("punkrecordsdata/uspto-trademark-status-scraper").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 = {
    "numbers": ["88888888"],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("punkrecordsdata/uspto-trademark-status-scraper").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 '{
  "numbers": [
    "88888888"
  ],
  "maxItems": 10
}' |
apify call punkrecordsdata/uspto-trademark-status-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,punkrecordsdata/uspto-trademark-status-scraper"
        }
    }
}
```

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/R9TcGOmQuL3pbZELA/builds/qYhvKHh7WWYbwtobJ/openapi.json
