# US Trademark Checker for Print-on-Demand Phrases (`natural_pegasus/us-trademark-phrase-checker`) Actor

Screen t-shirt, mug and sticker phrases against live USPTO trademarks: risk level, matching marks, status and classes for each phrase. $2 per 1,000 phrases.

- **URL**: https://apify.com/natural_pegasus/us-trademark-phrase-checker.md
- **Developed by:** [Nick](https://apify.com/natural_pegasus) (community)
- **Categories:** E-commerce, Business, For creators
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 phrase checks

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

## US Trademark Checker for Print-on-Demand Phrases

Check t-shirt, mug, sticker and poster phrases against live US trademarks before you publish a design. For every phrase you get a risk level, the marks that match it, their status, serial numbers and classes, with a link to the official USPTO record.

### Who it is for

- Print-on-demand sellers on Merch by Amazon, Etsy, Redbubble, Teepublic, Spreadshirt and similar marketplaces
- Design teams that screen slogans in bulk before uploading
- Automations and AI agents that need a quick US trademark screen as one step of a larger workflow

### How to use it

1. Paste your phrases, one per line. Up to 1,000 phrases per run.
2. Keep the default classes or enter your own.
3. Start the run and open the **Overview** table, or download the results as JSON, CSV or Excel.

### Input

| Field | What it does | Default |
|---|---|---|
| Phrases | 1 to 1,000 phrases per run. Each phrase can have up to 120 characters and 12 words | Example: `just do it`, `dog mom`, `plant lady` |
| Classes | Nice classes to check, comma separated, or `all` | `9,16,18,21,24,25`: phone cases, stickers and posters, bags, mugs, blankets, clothing |
| Include similar marks | Also find marks that are spelled a little differently. Such matches are reported as low risk | Off |

```json
{
  "phrases": ["just do it", "dog mom", "plant lady"],
  "classes": "9,16,18,21,24,25",
  "includeSimilar": false
}
```

### Output

One row per phrase:

| Field | Meaning |
|---|---|
| `phrase` | The phrase as you entered it |
| `risk` | `high`, `medium`, `low` or `none` |
| `reason` | Why the phrase got this risk level |
| `top_mark`, `top_status`, `top_serial`, `top_classes` | The most relevant matching mark |
| `match_count`, `matches` | All matching marks with status, serial and registration numbers, classes, owner for companies, filing and registration dates and a USPTO link |
| `checked_at` | When the USPTO data for this phrase was fetched |
| `error` | Empty, `invalid_phrase` or `not_checked` |

```json
{
  "phrase": "just do it",
  "risk": "high",
  "reason": "registered mark JUST DO IT in class 9, 21, 25 matches the phrase",
  "match_count": 20,
  "top_mark": "JUST DO IT",
  "top_status": "registered",
  "top_serial": "98030154",
  "top_classes": [9, 10, 21, 25],
  "checked_at": "2026-10-01T11:51:04Z",
  "error": null
}
```

### How to read the risk level

- **high**: a registered mark in your classes is the same as the phrase, or a registered mark of two or more words appears inside the phrase.
- **medium**: a pending application is the same as the phrase, a registered one-word mark appears inside the phrase, or a registered mark contains the whole phrase.
- **low**: marks match only outside your classes, only look alike, or are pending applications that overlap with the phrase.
- **none**: no live or pending mark matched.

Owner names are shown only for companies. Marks owned by individuals are listed without the owner's name.

### Pricing

**$2 per 1,000 checked phrases**, that is $0.002 per phrase, plus Apify's standard $0.00005 per run start.

- You pay only for phrases that were checked.
- Invalid phrases and phrases the service could not check are free.
- A phrase repeated in the same run is checked and charged once.
- Set a max cost per run and the Actor stops before it.

### Speed

A new phrase takes about a second. Phrases checked during the last few days come back instantly.

### Limits

- United States only: live registrations and pending applications at the USPTO.
- Word marks are compared by their text. Logos and design elements are not analyzed.
- This is a screening tool, not legal advice. Talk to a trademark attorney before you rely on a result.

### FAQ

**Is a `none` result a guarantee that I can use the phrase?**
No. It means no live or pending US mark matched the text. Unregistered rights, state marks and marks in other countries are not covered.

**Can I check more than 1,000 phrases?**
Split the list into several runs, or call the Actor from your own code in a loop.

**Can I use it from my code or an AI agent?**
Yes. Use the Apify API, the Python or JavaScript client or the Apify MCP server. The input and output formats are shown above.

# Actor input Schema

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

Phrases to check, one per line. Up to 1,000 per run, each up to 120 characters and 12 words.

## `classes` (type: `string`):

Nice classes to check, comma separated, or all. The default covers phone cases (9), stickers and posters (16), bags (18), mugs (21), blankets (24) and clothing (25).

## `includeSimilar` (type: `boolean`):

Also find marks that are spelled a little differently. Such matches are reported as low risk.

## Actor input object example

```json
{
  "phrases": [
    "just do it",
    "dog mom",
    "plant lady"
  ],
  "classes": "9,16,18,21,24,25",
  "includeSimilar": false
}
```

# Actor output Schema

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

No description

# 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",
        "dog mom",
        "plant lady"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("natural_pegasus/us-trademark-phrase-checker").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",
        "dog mom",
        "plant lady",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("natural_pegasus/us-trademark-phrase-checker").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",
    "dog mom",
    "plant lady"
  ]
}' |
apify call natural_pegasus/us-trademark-phrase-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,natural_pegasus/us-trademark-phrase-checker"
        }
    }
}
```

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/0aRhHTgcLnz3frNnH/builds/j1LGTtg17ueEstVSf/openapi.json
