# USPTO Trademark Checker: Bulk Phrase Risk for POD Sellers (`atesen-software/trademark-phrase-risk-check`) Actor

Check up to 1,000 slogans or brand ideas against live USPTO trademarks. One clear / low / medium / high risk verdict per phrase, with the conflicting marks, owners, classes and status. For print-on-demand, Etsy and Amazon Merch sellers. No login, no proxy.

- **URL**: https://apify.com/atesen-software/trademark-phrase-risk-check.md
- **Developed by:** [Atesen Software](https://apify.com/atesen-software) (community)
- **Categories:** Developer tools, Automation, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$50.00 / 1,000 phrase checkeds

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

## USPTO Trademark Checker: Bulk Phrase Risk Check for Print on Demand Sellers

Paste a list of slogans, product names or brand ideas and get one clear answer per phrase: **clear, low, medium or high trademark risk** in the US, with the live marks behind the answer. Built for print-on-demand, Etsy, Amazon Merch, Redbubble and Shopify sellers who screen hundreds of phrases before they upload a design.

The Actor searches the public USPTO trademark database (the same data as the official search page), compares every phrase with the registered and pending marks, and rates the risk for **your product classes** (for example class 25 for T-shirts and hats, class 21 for mugs). It is a fast first screen. It is not legal advice and not a clearance opinion.

- **$0.05 per phrase checked.** Phrases that could not be checked are free. No monthly fee, no start fee beyond the Apify platform default.
- Up to **1,000 phrases per run**. Duplicates are checked once.
- **No login, no API key, no proxy.**
- Export as JSON, CSV, Excel or call it through the Apify API.

### What you get for every phrase

| Field | Meaning |
|---|---|
| `verdict` | `clear`, `low`, `medium`, `high`, or `error` |
| `verdictReason` | One sentence, for example "3 live exact match(es) in your classes" |
| `liveExactMatches`, `liveContainingMatches`, `liveSimilarMatches` | How many live marks match the phrase exactly, contain it (or sit inside it), or look similar |
| `topMatchWordmark`, `topMatchOwner`, `topMatchStatus`, `topMatchSerialNumber` | The most serious conflict, flat fields for spreadsheets |
| `matches[]` | Conflicting marks, most serious first: serial and registration number, wording, match type, status, classes, whether it sits in your class, owner, filing and registration date, goods and services, link to the USPTO case page |

### How the verdict is decided

| Verdict | Rule |
|---|---|
| **high** | A live (registered or pending) mark with the same wording in one of your classes |
| **medium** | A live mark that contains your phrase or sits inside it in your classes, or a live exact match in another class |
| **low** | Only similar spellings in your classes, related marks in other classes, or dead marks |
| **clear** | No live matching mark found |

If you leave the classes empty, every class counts the same.

### Example input

```json
{
  "phrases": ["Just do it", "Cat Dad Life", "Zxqvk Plumbo Wrenly"],
  "classes": ["25"],
  "matchMode": "exact-and-similar",
  "maxMatchesPerPhrase": 5
}
```

### Example output (shortened)

```json
{
  "phrase": "Just do it",
  "verdict": "high",
  "verdictReason": "3 live exact match(es) in your classes",
  "liveExactMatches": 12,
  "topMatchWordmark": "JUST DO IT.",
  "topMatchOwner": "NIKE, INC.",
  "topMatchStatus": "registered",
  "matches": [
    { "serialNumber": "73829171", "wordmark": "JUST DO IT.", "matchType": "exact", "status": "registered", "classes": ["25"], "inRequestedClass": true, "ownerName": "NIKE, INC.", "usptoUrl": "https://tsdr.uspto.gov/#caseNumber=73829171&caseType=SERIAL_NO&searchType=statusSearch" }
  ],
  "source": "USPTO trademark search (tmsearch.uspto.gov)"
}
```

### Input

- **Phrases to check**: one per line, up to 1,000.
- **Your product classes**: class 25 clothing, 21 mugs and housewares, 9 phone cases, 16 posters and stickers, 18 bags, 20 pillows, 24 blankets, and more. Default is 25.
- **Match mode**: exact and similar (default, one extra search per phrase) or exact only.
- **Include dead marks**: also list abandoned and cancelled marks. They never raise the verdict above low.
- **Matches per phrase**: 1 to 50, default 10.
- **Show names of individual owners**: off by default. When a mark belongs to a private person the name is withheld; company names are always shown.

### Use it from code or with AI agents

```bash
curl -X POST "https://api.apify.com/v2/acts/atesen-software~trademark-phrase-risk-check/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"phrases":["Mama Bear","Cat Dad Life"],"classes":["25","21"]}'
```

The Actor works with the Apify MCP server, so an AI agent can screen a list of design ideas and keep only the `clear` and `low` ones. Make, Zapier and n8n can call it through the Apify integrations.

### Good to know

- **US marks only.** The data is the USPTO register. A phrase that is clear here can still be protected in the EU, the UK or elsewhere.
- **Word marks.** Logos and design marks are not compared visually. Wording, spelling and word order are.
- **Speed.** The Actor sends about one request per second to be polite to the USPTO servers. A run of 100 phrases takes roughly five minutes.
- **Freshness.** Results are read live. New applications appear as soon as the USPTO publishes them.
- **Not legal advice.** A `clear` verdict means no live matching mark was found in this search. It does not guarantee you can use a phrase. Ask a trademark attorney before you build a brand on it.
- If the USPTO answers with a bot check or a block, the run stops, marks the remaining phrases as `error` (free) and never tries to get around it.

### Data and privacy

The data comes from the public USPTO trademark records. The Actor reads marks, status, classes and owner names of companies. Owner addresses and attorney details are not collected, and names of private persons are withheld unless you switch them on.

# Actor input Schema

## `phrases` (type: `array`):

Slogans, product names or brand ideas, one per line, up to 1,000 per run. Example: Cat Dad, Just do it, Mama Bear. Duplicates are checked once.

## `classes` (type: `array`):

USPTO international classes your product falls into. A live exact match in one of these classes is rated high risk; the same match in another class is rated medium. Leave empty to treat every class the same. Class 25 is clothing, 21 mugs and housewares, 9 phone cases, 16 posters and stickers, 18 bags, 20 pillows and furniture, 24 blankets and textiles.

## `matchMode` (type: `string`):

Exact and similar also looks for near spellings and marks with the same words (one extra search per phrase). Exact checks the phrase itself only.

## `includeDead` (type: `boolean`):

Also list abandoned and cancelled marks. They never raise the verdict above low.

## `maxMatchesPerPhrase` (type: `integer`):

How many conflicting marks to list for each phrase, most serious first.

## `includeIndividualOwners` (type: `boolean`):

Off by default: when the owner is a private person, the name is withheld and only the owner type is shown. Company names are always shown.

## Actor input object example

```json
{
  "phrases": [
    "Just do it",
    "Cat Dad Life",
    "Zxqvk Plumbo Wrenly"
  ],
  "classes": [
    "25"
  ],
  "matchMode": "exact-and-similar",
  "includeDead": false,
  "maxMatchesPerPhrase": 10,
  "includeIndividualOwners": false
}
```

# Actor output Schema

## `results` (type: `string`):

One row per phrase with the verdict and the conflicting marks

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

Phrases checked, failures, verdict counts and the reason the run stopped

# 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 = {
    "phrases": [
        "Just do it",
        "Cat Dad Life",
        "Zxqvk Plumbo Wrenly"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("atesen-software/trademark-phrase-risk-check").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 = { "phrases": [
        "Just do it",
        "Cat Dad Life",
        "Zxqvk Plumbo Wrenly",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("atesen-software/trademark-phrase-risk-check").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 '{
  "phrases": [
    "Just do it",
    "Cat Dad Life",
    "Zxqvk Plumbo Wrenly"
  ]
}' |
apify call atesen-software/trademark-phrase-risk-check --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,atesen-software/trademark-phrase-risk-check"
        }
    }
}
```

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/KU9fJeenTfIoMymlN/builds/9YQ9dDyfgCguh4xNZ/openapi.json
