# USPTO Trademark Search, Owner & Gazette Monitor (`luminar/uspto-trademark-monitor`) Actor

Search official USPTO trademark records, inspect current status and ownership, retrieve recorded assignments and Gazette publications, and monitor typed changes.

- **URL**: https://apify.com/luminar/uspto-trademark-monitor.md
- **Developed by:** [Luka](https://apify.com/luminar) (community)
- **Categories:** Automation, Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $14.25 / 1,000 trademark search 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

Search official USPTO trademark records by name, owner, serial number, registration number, assignment party, or Trademark Official Gazette issue. Get current status and owner evidence, recorded assignment history, Gazette publications, or only verified changes on repeat runs.

Choose one workflow, paste the smallest useful target, and start with the safe defaults. The Actor uses first-party USPTO HTTPS sources directly—no USPTO account, API key, browser, proxy, child Actor, or competing scraper.

Trademark search output is evidence retrieval, **not a legal clearance opinion**. A recorded assignment is not automatically the current owner, and a missing value is never presented as a completed check.

### 🚀 Start in 60 seconds

1. Choose **Search trademarks** and leave **Baseline** selected.
2. Enter a word mark, owner, or other supported term.
3. Keep **Maximum search records** at 10 for the first run.
4. Start the Actor, then open the Dataset to inspect status, owner, classes, goods/services, and coverage.

```json
{
  "operation": "trademark_search",
  "mode": "baseline",
  "searchTerms": ["APPLE"],
  "maxSearchResults": 10,
  "maxBuyerChargeUsd": 5
}
```

### 🎯 Choose the right workflow

| Workflow | Best for | What it returns |
|---|---|---|
| Search trademarks | Name, owner, goods/services, number, design, or advanced field search | Official search rows, optionally enriched with current case details |
| Look up cases | Exact serial or registration numbers | Current status, owner, attorney/correspondent, classes, history, and documents |
| Build an owner portfolio | One or more owner names plus optional deeper evidence | Current portfolio records with optional assignments and Gazette publications |
| Search assignment history | Serial, registration, assignee, or assignor | Recorded reel/frame/property transactions with separate parties and dates |
| Search Gazette publications | Latest or chosen issue dates | Filtered official results or streamed complete ST.96 XML issue evidence |

Use `baseline` to return the selected current evidence. Use `changes` to compare the exact normalized target scope with the last successfully delivered state. The first Changes run safely initializes a baseline; later runs emit only typed changes, plus optional free unchanged audit rows.

### 📦 What you get

Every row has a stable identity, an explicit row type, official-source provenance, and a coverage result. Depending on the workflow, rows can include:

- serial and registration numbers, mark wording, status code/text/date, and normalized LIVE/DEAD/UNKNOWN state;
- current owner, reported owners, attorney/correspondent, classes, goods/services, history, and document metadata;
- assignment reel/frame identity, conveyance, assignors, assignees, execution/recordation dates, and official document URL;
- Gazette issue date, reason code/text, section, classes, mark, and owner evidence;
- typed `NEW`, `UPDATED`, `STATUS_CHANGED`, `OWNER_CHANGED`, `ASSIGNMENT_RECORDED`, or `GAZETTE_PUBLISHED` events with `before`, `after`, and `changedFields`;
- per-target source receipts with raw, filtered, duplicate, invalid, and delivered counts.

| `recordType` | Meaning |
|---|---|
| `trademark_search_record` | Official search result, optionally enriched with current detail |
| `trademark_snapshot` | Exact current serial-based case snapshot |
| `assignment_record` | One recorded reel/frame/property transaction |
| `gazette_record` | One issue/date/reason publication fact |
| `change` | One deterministic typed transition |
| `unchanged` | Optional free audit row in Changes mode |
| `source_receipt` | Attempt, completion, count, cap, and coverage evidence for one target |

![Synthetic USPTO trademark, assignment, and Gazette output](https://api.apify.com/v2/key-value-stores/DJgPR6wwS2tIaLDQW/records/uspto_trademark_change_monitor--3a3b69b2fe6bd0b9-uspto-trademark-monitor-output.png)

*Synthetic fixture preview generated through the Actor's real output path. It uses reserved test identities and makes no live USPTO request.*

Representative fixture row (guaranteed core fields plus common search fields):

```json
{
  "recordType": "trademark_search_record",
  "entityType": "search",
  "stableId": "uspto:tm:serial:99000001",
  "serialNumber": "99000001",
  "registrationNumber": "9901001",
  "mark": "NORTHSTAR FIXTURE",
  "statusCode": "700",
  "statusText": "REGISTERED",
  "liveDead": "LIVE",
  "currentOwner": {
    "name": "NORTHSTAR FIXTURE LABS LLC",
    "entityType": "LIMITED LIABILITY COMPANY",
    "country": "US"
  },
  "sourceRoute": "USPTO_TRADEMARK_SEARCH_TSDR_DETAIL",
  "sourceRetrievedAt": "2026-08-28T20:00:00.000Z",
  "coverageStatus": "COMPLETE",
  "sourceContractVersion": "USPTO_TM_PUBLIC_V2_20260829"
}
```

Because this is a synthetic fixture, it deliberately omits `sourceUrl`. Live rows include the exact first-party USPTO URL used for that retrieval.

Stable identities are target-safe: cases use the eight-digit serial; assignments use reel, frame, and serial; Gazette events use issue date, serial, and reason code. Registration numbers remain aliases. Search rank loss, Gazette absence, and an assignment recording never become invented removal or ownership events.

### 🎛️ Input guide

#### Start and monitoring

| Input | Default | Effect on result or cost |
|---|---:|---|
| `operation` | `trademark_search` | Selects one of the five official-source workflows. |
| `mode` | `baseline` | `changes` enables exact target-scoped state and typed repeat-run events. |
| `maxBuyerChargeUsd` | 5 USD | Stops before source work when the conservative maximum event charge could exceed this ceiling. |
| `watchId` | empty | Adds a human state namespace; normalized targets, filters, routes, and caps are still hashed. |
| `includeUnchanged` | false | Changes only: adds free unchanged audit rows without billing them as changes. |

#### Trademark search, cases, and portfolios

| Input | Default | Hard bound and behavior |
|---|---:|---|
| `searchTerms` | `APPLE` | Up to 20 terms, each 120 characters; used by Search and Portfolio. |
| `searchField` | `all` | One of nine bounded official field groups. |
| `searchMatchType` | `contains` | Contains, exact phrase, prefix, or escaped wildcard matching. |
| `advancedQueries` | empty | Up to 10 bounded AND/OR/NOT field clauses; raw query JSON is rejected. |
| `maxSearchResults` | 10 | Maximum 500 unique results; reports `CAPPED` when valid scope remains. |
| `serialNumbers` | empty | Exact eight-digit case identities; combined serial/registration inputs cannot exceed 500. |
| `registrationNumbers` | empty | Registration aliases resolved to serial identity before monitoring. |
| `ownerNames` | empty | Up to 20 current-owner portfolio terms, each 160 characters. |
| `includeDetails` | true | Adds one current-detail request per resolved serial and replaces basic fields with richer current evidence where available. |
| `includeAssignments` | false | Adds recorded Assignment Center rows; turn it on only when transaction history is useful. |
| `includeGazette` | false | Portfolio only: adds the selected Gazette issue route and its issue/result units. |

#### Assignment history

| Input | Default | Hard bound and behavior |
|---|---:|---|
| `assigneeNames` | empty | Up to 20 recorded-assignee party searches. |
| `assignorNames` | empty | Up to 20 recorded-assignor party searches. |
| `assignmentNameMatch` | `partial` | Chooses the official partial or exact party-name search behavior. |
| `maxAssignmentRecords` | 100 | Maximum 2,500 unique assignment rows; remaining valid scope is `CAPPED`. |

#### Trademark Official Gazette

| Input | Default | Hard bound and behavior |
|---|---:|---|
| `gazetteIssueDates` | latest published | Up to four Tuesday issue dates in `YYYY-MM-DD` format. |
| `gazetteRoute` | `xml_bulk` | Complete streaming XML is issue-backed but much larger; `api_filter` is cheaper and covers only the declared filter. |
| `gazetteSearchTerms` | empty | Up to 25 mark, owner, goods/services, or serial terms. |
| `gazetteSearchIn` | all supported | Up to four supported Gazette fields. |
| `publicationReasons` | all | Up to 20 official reason codes or names. |
| `internationalClasses` | all | Optional Nice classes 1–45. |
| `maxGazetteRecords` | 50 | Maximum 5,000 matching publications; an unfinished issue is `CAPPED`. |

#### Limits and safeguards

| Input | Default | Hard bound and behavior |
|---|---:|---|
| `maxItems` | 1,000 | Global maximum 5,000 business rows after target-scoped deduplication. |
| `maxTrackedItems` | 2,500 | Maximum 5,000 state records; must cover the selected Changes workload. |
| `maxRequests` | 1,000 | Hidden request/retry guard; maximum 5,000. |
| `maxSourceBytes` | 300,000,000 | Hidden transfer guard; maximum 1,000,000,000 bytes. Increase only for multiple full XML issues. |
| `maxRuntimeSecs` | 600 | Hidden source-work deadline; maximum 1,800 seconds. |
| `requestIntervalMs` | 350 | Hidden ordinary-request pacing guard; allowed range 250–5,000 ms. |

### 💰 Pricing

Apify shows the authoritative event prices before you start a priced run. The total follows the work actually delivered:

`run charge = delivered Baseline search rows or watch results/changes + delivered case or assignment rows + a minimum completed check only when those units are below the safe run minimum + completed watch or Gazette checks + delivered Gazette publications`

There is no generic paid start event. On a non-Gazette, non-watch run, the Actor first totals the useful business units it can actually deliver. It adds one completion-check receipt only when those units alone would fall below the run's conservative minimum; valuable Search or Assignment rows that already cover that minimum do not receive an unnecessary extra check. Search/Portfolio Changes use a separate watch-result/change unit plus one completed watch check. A completed requested Gazette issue uses its issue/source-check units even when buyer filters leave zero matching publications. Blocked, partial, capped, duplicate, suppressed, and undelivered work is never used to justify a completion charge.

| Event | Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---:|---:|---:|---:|---:|---:|
| Trademark search record | $0.01425 | $0.01425 | $0.01425 | $0.01425 | $0.01425 | $0.01425 |
| Watch result or change | $0.04750 | $0.04750 | $0.04750 | $0.04750 | $0.04750 | $0.04750 |
| Complete trademark watch check | $0.04750 | $0.04750 | $0.04750 | $0.04750 | $0.04750 | $0.04750 |
| Completed official USPTO check | $0.007295 | $0.007295 | $0.007295 | $0.007295 | $0.007295 | $0.007295 |
| Verified Gazette source run | $0.03800 | $0.03800 | $0.03800 | $0.03800 | $0.03800 | $0.03800 |
| Current trademark check | $0.000475 | $0.000475 | $0.000475 | $0.000475 | $0.000475 | $0.000475 |
| Status or owner change | $0.002850 | $0.002850 | $0.002850 | $0.002850 | $0.002850 | $0.002850 |
| Recorded assignment | $0.006175 | $0.0060135 | $0.0058615 | $0.005700 | $0.005700 | $0.005700 |
| Complete Gazette issue check | $0.09500 | $0.08550 | $0.07600 | $0.06365 | $0.06365 | $0.06365 |
| Gazette publication | $0.07600 | $0.06840 | $0.06080 | $0.05092 | $0.05092 | $0.05092 |

The event name describes the billing trigger. A row, change, check, or publication is charged only after its corresponding useful result or completion receipt is ready for confirmed delivery.

`maxBuyerChargeUsd` is checked conservatively before the first official request. Blocked, invalid, duplicate, suppressed, and undelivered rows are not paid events. Start with small result limits; raise only the cap that expands a useful buyer outcome.

### ✅ Coverage you can trust

| Coverage | Exact meaning |
|---|---|
| `COMPLETE` | Every requested target or bounded partition finished and all required rows were retained for delivery. |
| `PARTIAL` | Useful evidence was retained, but at least one required target or partition failed. |
| `FILTERED` | The official partition completed and declared buyer filters removed source rows. |
| `CAPPED` | A declared row, page, byte, request, runtime, state, or spending guard stopped valid remaining scope. |
| `BLOCKED` | A required route or source contract failed; no empty conclusion is allowed. |
| `EMPTY_CONFIRMED` | The complete bounded requested scope finished successfully with zero matching rows. |

Every declared search query, assignment query, and Gazette issue gets its own receipt. A target skipped after a run-wide unique-row cap is explicitly `CAPPED`, `attempted: false`, and `exhausted: false`. If filters examine source rows but remove all of them, the result is `FILTERED` zero—not source-wide `EMPTY_CONFIRMED`.

Changes state uses schema v2 with deterministic v1 migration, integrity validation, a 5,000-record / 9 MB boundary, and exact scope hashing. A PREPARED delivery outbox is persisted before event-aware Dataset delivery. State commits only after confirmed delivery; incomplete, blocked, capped, or ambiguous attempts cannot advance it or silently retry a possible charge.

#### Locked official routes

| Surface | First-party route | Method |
|---|---|---|
| Trademark search | `tmsearch.uspto.gov/.../tmsearch` | POST |
| Current case detail | `tmsearch.uspto.gov/.../tsdr-api?serialNumber=...` | GET |
| Assignment history | `assignmentcenter.uspto.gov/.../public/search/trademark` | POST |
| Gazette discovery/filter | `tm-eog-service.uspto.gov/.../external/search/...` | GET/POST |
| Gazette bulk XML | `cdn.uspto.gov/doc/TMOGIssue_..._entire?extension=xml` | GET stream |

The Actor rejects every other host/path/method combination, redirects, HTML on JSON/XML routes, unexpected media types, and source-contract drift. Ordinary requests are paced and transient retries are bounded.

### 🔌 API and automation

Download Dataset rows as JSON, CSV, Excel, XML, or RSS, or read them through the Apify API. The Output tab links to the mixed Dataset, buyer overview, and `OUTPUT` run summary.

For repeat monitoring, save a successful Changes input as an Apify Task and schedule that Task at the interval you need. Keep the same targets and `watchId`; changing a target, filter, route, or cap intentionally creates a separate state scope. Downstream automation should branch on `recordType`, then inspect `changeType`, `changeTypes`, `before`, `after`, and `coverageStatus` before acting.

### ❓ FAQ and support

#### Does a result prove that a mark is available?

No. The Actor retrieves official evidence; it does not make clearance, infringement, validity, availability, or legal conclusions.

#### Is the latest recorded assignee always the current owner?

No. Assignment history and current TSDR owner evidence remain separate so one never silently overwrites the other.

#### Why did my run return `CAPPED`?

One declared guard stopped remaining valid scope. Read the target's `stopReason`, raise only the relevant limit, and rerun the same scope.

#### Can no Gazette match be treated as unchanged current status?

No. Gazette absence applies only to the completed issue/filter scope. Current status comes from current case-detail evidence.

#### What should I include in a support request?

Include the Apify run ID, input with secrets removed, affected `stableId` values, and the relevant source receipt. Never send account tokens or private credentials.

# Actor input Schema

## `operation` (type: `string`):

Chooses the official USPTO source workflow and therefore the records, requests and possible event charges.

## `mode` (type: `string`):

Changes compares the exact normalized scope with its last successfully delivered state. Its first run safely initializes a Baseline instead of inventing historical alerts. Only Search/watch and Portfolio/watch add a complete watch-check unit; case, assignment and Gazette workflows use their own result or issue units.

## `maxBuyerChargeUsd` (type: `number`):

Stops before source work if declared limits could exceed this event-charge ceiling. Zero-result search, case and assignment runs have no fixed scan event; a complete Gazette issue or selected search/portfolio watch can still be a delivered unit. Apify's own maximum cost setting remains separate.

## `searchTerms` (type: `array`):

Primary target for the default Search workflow and owner Portfolio discovery. Use plain text, or choose Wildcard matching for \* and ?. Up to 20 official-register queries share the result cap; other workflows use their clearly grouped identifiers or party names below.

## `searchField` (type: `string`):

Limits each basic term to the selected official field.

## `searchMatchType` (type: `string`):

Changes how basic terms are escaped and matched. Wildcard preserves only \* and ?; raw Elasticsearch JSON is never accepted.

## `advancedQueries` (type: `array`):

Optional AND/OR/NOT clauses over bounded official fields. These are converted to a locked request shape; buyer-supplied query JSON is prohibited.

## `maxSearchResults` (type: `integer`):

Run-wide search cap. 500 is the tested contract boundary. Reaching it with more source hits reports CAPPED.

## `serialNumbers` (type: `array`):

Exact eight-digit USPTO application serial numbers. Serial is the canonical monitoring identity.

## `registrationNumbers` (type: `array`):

Official registration-number aliases. The Actor resolves each to a serial before state identity.

## `ownerNames` (type: `array`):

Portfolio search terms for the official current-owner field. Results are evidence records, not proof of legal title.

## `includeDetails` (type: `boolean`):

Adds one official detail request per resolved serial for status, owner, attorney/correspondent, classes, history and documents. This increases requests and source bytes.

## `includeAssignments` (type: `boolean`):

Adds official Assignment Center rows by resolved serial. A recorded assignment remains distinct from the current-owner field.

## `includeGazette` (type: `boolean`):

Portfolio only. Adds the selected official Gazette route and issue filters; complete XML can add hundreds of megabytes per issue.

## `assigneeNames` (type: `array`):

Assignment Center party search. Exact or partial matching is controlled below.

## `assignorNames` (type: `array`):

Optional recorded-assignor party queries.

## `assignmentNameMatch` (type: `string`):

Selects the official partial or exact assignee/assignor searchBy value.

## `maxAssignmentRecords` (type: `integer`):

Run-wide assignment cap. The deliberately conservative 2,500 boundary replaces larger unproved competitor limits.

## `gazetteIssueDates` (type: `array`):

Tuesday issue dates (YYYY-MM-DD). Leave empty to discover the latest published issue. The conservative XML-backed run boundary is four issues.

## `gazetteRoute` (type: `string`):

XML gives issue-backed bulk coverage and can transfer about 237 MB per issue. API filter is cheaper for narrow searches but only covers the declared filter.

## `gazetteSearchTerms` (type: `array`):

Optional case-insensitive mark, owner or goods keywords. Empty means no text filter.

## `gazetteSearchIn` (type: `array`):

Official filtered-search fields. Empty uses the source default and XML filtering checks all supported text fields.

## `publicationReasons` (type: `array`):

Optional official publication reason/code filter, such as OPPOSITION. Empty means all reasons.

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

Optional Nice classes 1-45. Empty means all classes.

## `maxGazetteRecords` (type: `integer`):

Run-wide Gazette match cap. XML parsing stops only after detecting one additional match, so CAPPED is explicit.

## `watchId` (type: `string`):

Optional human label for an isolated Changes state. The exact normalized inputs are also hashed, preventing accidental state reuse.

## `includeUnchanged` (type: `boolean`):

Changes only. Adds free UNCHANGED rows; they are never billed as changes.

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

Global business-row cap across every selected source. Reaching it while more matching data exists reports CAPPED.

## `maxTrackedItems` (type: `integer`):

Changes state boundary. It must be at least the maximum possible business rows for the selected run.

## `maxRequests` (type: `integer`):

Run-wide official-USPTO request and retry guard.

## `maxSourceBytes` (type: `integer`):

Run-wide transfer guard. One current full Gazette XML issue is about 237 MB.

## `maxRuntimeSecs` (type: `integer`):

Run-wide source-work runtime guard.

## `requestIntervalMs` (type: `integer`):

Minimum delay between ordinary official requests. Retries add bounded backoff.

## `_luminarQaFaultStage` (type: `string`):

Factory-only fault request. Runtime rejects it unless the exact canonical rel-uspto build runs on the separately registered private QA Actor with matching Actor-key and fleet-isolation locks.

## Actor input object example

```json
{
  "operation": "trademark_search",
  "mode": "baseline",
  "maxBuyerChargeUsd": 5,
  "searchTerms": [
    "APPLE"
  ],
  "searchField": "all",
  "searchMatchType": "contains",
  "maxSearchResults": 10,
  "includeDetails": true,
  "includeAssignments": false,
  "includeGazette": false,
  "assignmentNameMatch": "partial",
  "maxAssignmentRecords": 100,
  "gazetteRoute": "xml_bulk",
  "maxGazetteRecords": 50,
  "includeUnchanged": false,
  "maxItems": 1000,
  "maxTrackedItems": 2500,
  "maxRequests": 1000,
  "maxSourceBytes": 300000000,
  "maxRuntimeSecs": 600,
  "requestIntervalMs": 350
}
```

# Actor output Schema

## `dataset` (type: `string`):

Mixed official-USPTO Dataset. Use recordType and entityType to distinguish rows.

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

Key identity, status, owner, assignment and Gazette columns.

## `runSummary` (type: `string`):

Route receipts, caps, billing simulation and state commit result.

# 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 = {
    "operation": "trademark_search",
    "mode": "baseline",
    "maxBuyerChargeUsd": 5,
    "searchTerms": [
        "APPLE"
    ],
    "searchField": "all",
    "searchMatchType": "contains",
    "maxSearchResults": 10,
    "includeDetails": true,
    "includeAssignments": false,
    "includeGazette": false,
    "assignmentNameMatch": "partial",
    "maxAssignmentRecords": 100,
    "gazetteRoute": "xml_bulk",
    "maxGazetteRecords": 50,
    "includeUnchanged": false,
    "maxItems": 1000,
    "maxTrackedItems": 2500,
    "maxRequests": 1000,
    "maxSourceBytes": 300000000,
    "maxRuntimeSecs": 600,
    "requestIntervalMs": 350
};

// Run the Actor and wait for it to finish
const run = await client.actor("luminar/uspto-trademark-monitor").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 = {
    "operation": "trademark_search",
    "mode": "baseline",
    "maxBuyerChargeUsd": 5,
    "searchTerms": ["APPLE"],
    "searchField": "all",
    "searchMatchType": "contains",
    "maxSearchResults": 10,
    "includeDetails": True,
    "includeAssignments": False,
    "includeGazette": False,
    "assignmentNameMatch": "partial",
    "maxAssignmentRecords": 100,
    "gazetteRoute": "xml_bulk",
    "maxGazetteRecords": 50,
    "includeUnchanged": False,
    "maxItems": 1000,
    "maxTrackedItems": 2500,
    "maxRequests": 1000,
    "maxSourceBytes": 300000000,
    "maxRuntimeSecs": 600,
    "requestIntervalMs": 350,
}

# Run the Actor and wait for it to finish
run = client.actor("luminar/uspto-trademark-monitor").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 '{
  "operation": "trademark_search",
  "mode": "baseline",
  "maxBuyerChargeUsd": 5,
  "searchTerms": [
    "APPLE"
  ],
  "searchField": "all",
  "searchMatchType": "contains",
  "maxSearchResults": 10,
  "includeDetails": true,
  "includeAssignments": false,
  "includeGazette": false,
  "assignmentNameMatch": "partial",
  "maxAssignmentRecords": 100,
  "gazetteRoute": "xml_bulk",
  "maxGazetteRecords": 50,
  "includeUnchanged": false,
  "maxItems": 1000,
  "maxTrackedItems": 2500,
  "maxRequests": 1000,
  "maxSourceBytes": 300000000,
  "maxRuntimeSecs": 600,
  "requestIntervalMs": 350
}' |
apify call luminar/uspto-trademark-monitor --silent --output-dataset

```

## MCP server setup

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

```

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/i4P31veBsbx9ZRsEl/builds/cLSwjpMnz4acGOLCa/openapi.json
