Skip to content
    ↑↓ to choose · Enter to open

    · 16 min read

    USPTO Trademark Search Scraper: 49 Data Fields per Record (2026)

    By CrawlerBros Engineering Team

    Each record carries 49 output fields, including owner details, filing and registration dates, goods and services text, and TTAB proceeding history. This Actor offers seven search modes to cover various lookup axes. You can try it before paying, as Apify's free plan covers up to 1,000 results of this Actor. It is suitable for legal professionals, brand managers, and intellectual property researchers who need detailed U.S. trademark information. It is not for anyone who needs to bypass rate limits using raw field-tag syntax, which the records do not include.

    Try it before you read further. Apify's free plan includes $5.00 of usage every month with no credit card, enough for up to 1,000 results at $0.005 each before platform usage. Open USPTO Trademark Search Scraper on Apify and run the prefilled example.

    How reliable is USPTO Trademark Search Scraper in production?

    Across the last 30 days of public runs on the Apify platform, USPTO Trademark Search Scraper recorded 55 runs with the following outcomes.

    Outcome Runs Share
    Succeeded 54 98.2%
    Failed 1 1.8%
    Aborted by the user 0 0.0%
    Timed out 0 0.0%
    Total 55 100.0%

    The platform telemetry shows about 2 runs in a hundred failing or timing out, based on the last 30 days of public runs. You should build automated retries into your workflows and set up alerts to catch these infrequent failures. Consider smaller input batches for critical processes.

    What does it cost to run USPTO Trademark Search Scraper?

    Each result costs $0.005 on Apify's free plan, which is $5.00 per 1,000 results. Starting a run is charged separately at $0.005 per GB of Actor memory. Apify also bills the platform usage each run consumes, at the rates of your Apify plan, on top of these charges.

    Apify plan Per result Per 1,000 results
    FREE $0.005 $5.00
    BRONZE $0.00433 $4.33
    SILVER $0.00367 $3.67
    GOLD $0.003 $3.00
    PLATINUM $0.003 $3.00
    DIAMOND $0.003 $3.00

    Worked example: collecting 10,000 results costs $50.00 in result charges before run-start fees and platform usage. With 1.8% of runs failing or timing out in the last 30 days, budget for re-running a portion of those batches rather than assuming every run completes.

    The primary driver of cost for this Actor is the number of results returned, which is directly controlled by the "maxItems" input. To efficiently estimate costs, start with a small "maxItems" value, such as 20 or 50, on your initial runs. This allows you to verify the relevance and quality of the data without incurring significant charges.

    How do you run USPTO Trademark Search Scraper from the API?

    The schema marks 1 of its 13 controls as required: mode. Every value in the payload below comes from the published schema's own prefills, which means you can paste it, swap the token, and get a real result.

    Call the synchronous endpoint to start a run and receive dataset items in one request:

    curl -X POST "https://api.apify.com/v2/acts/crawlerbros~uspto-trademark-search-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"mode":"search"}'
    

    The same run from Python, using the official client:

    from apify_client import ApifyClient
    
    client = ApifyClient("<YOUR_APIFY_TOKEN>")
    
    run_input = {
      "mode": "search"
    }
    
    run = client.actor("crawlerbros~uspto-trademark-search-scraper").call(run_input=run_input)
    
    for item in client.dataset(run["defaultDatasetId"]).iterate_items():
        print(item)
    

    And from Node.js:

    import { ApifyClient } from 'apify-client'
    
    const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' })
    
    const input = {
      "mode": "search"
    }
    
    const run = await client.actor('crawlerbros~uspto-trademark-search-scraper').call(input)
    const { items } = await client.dataset(run.defaultDatasetId).listItems()
    console.log(items)
    

    That endpoint blocks until the run completes. Fine while you are testing a handful of records, risky once a run takes minutes: a dropped connection loses the response even though the run itself finished. Switch to an asynchronous start with polling or a webhook before you schedule anything.

    Which USPTO Trademark Search Scraper inputs matter, and which can you skip?

    The mode control is the most impactful input, determining the fundamental search strategy: whether you are searching by a "searchQuery" or performing exact lookups by numbers. For initial exploration, keep "maxItems" at its default. Most users can leave proxyConfiguration alone, as the USPTO search API is public and usually does not require proxies.

    • mode (string): What to search. Default: "search".
    • searchQuery (string): Free-text trademark/wordmark query (mode=search), e.g. apple or nike air. Default: "apple".
    • serialNumbers (array): USPTO application serial numbers, e.g. 74683130. Default: [].
    • registrationNumbers (array): USPTO registration numbers, e.g. 2005764. Default: [].
    • ownerName (string): Free-text owner/applicant name query, e.g. nike inc.
    • goodsAndServicesQuery (string): Free-text keyword to search within the goods & services description, e.g. coffee.
    • proceedingNumbers (array): USPTO Trademark Trial and Appeal Board proceeding numbers (opposition/cancellation), e.g. 91177505. Default: [].
    • internationalRegistrationNumbers (array): WIPO Madrid Protocol international registration numbers, e.g. 0870749. Default: [].
    • status (string): Restrict results to live (active) or dead (abandoned/cancelled/expired) trademark filings. Default: "any".
    • internationalClass (string): Restrict results to a single Nice Classification international class. Default: "any".
    • markType (string): Restrict results to a specific mark type. Default: "any".
    • maxItems (integer): Hard cap on emitted records. Default: 20.

    The other 1 controls, with their defaults, are listed in the input schema on USPTO Trademark Search Scraper on Apify.

    Fixed-choice controls: mode accepts search (Search by mark/keyword), bySerialNumber (Lookup by serial number(s)), byRegistrationNumber (Lookup by registration number(s)), byOwner (Search by owner/applicant name), byGoodsServices (Search by goods & services description), byProceedingNumber (Lookup by TTAB proceeding number(s)), byInternationalRegistrationNumber (Lookup by Madrid international registration number(s)); status accepts any (Any status), live (Live only), dead (Dead only); internationalClass accepts 49 values (default any), including any (Any class), 001 (Chemicals), 002 (Paints), 003 (Cosmetics and cleaning preparations); markType accepts any (Any type), TRADEMARK, SERVICE MARK, COLLECTIVE MARK, COLLECTIVE MEMBERSHIP MARK, CERTIFICATION MARK.

    What does USPTO Trademark Search Scraper return?

    The returned records are comprehensive, providing full details like owner information, all relevant dates, international classifications, and links to the official USPTO TSDR case-status page. They do not, however, contain any contact details for owners or applicants beyond what is publicly listed in the record, nor do they expose the raw field-tag search syntax of the USPTO UI.

    • serialNumber - USPTO application serial number
    • registrationNumber - USPTO registration number (only present once registered)
    • wordmark - the literal trademark text
    • wordmarkPseudoText[] - normalized/phonetic equivalent text
    • status - live or dead; statusCode, statusDescription - USPTO's detailed numeric/text status (e.g. REGISTERED AND RENEWED)
    • registered - whether the filing has proceeded to registration
    • markType - primary mark type (e.g. TRADEMARK, SERVICE MARK, CERTIFICATION MARK)
    • markTypes[] - all mark types, when a filing has more than one
    • markDescription[], designCodeDescription[], designCode[] - design-mark descriptions and USPTO design search codes, when applicable
    • internationalClass[] - Nice Classification codes (e.g. 009, 035, 200)
    • usClass[], coordinatedClass - US classification codes
    • ownerName[], ownerFullText[], ownerType, ownerEntity, ownerCitizenship, ownerCity, ownerStateCountryAddress, ownerDBA - owner/registrant information
    • attorney - attorney of record, if any
    • goodsAndServices[] - goods & services description text (capped at 20 entries)
    • disclaimer, translation, transliteration - legal disclaimer, foreign-wording translation, and transliteration text
    • currentBasis[], originalBasis[], registrationType[], standardCharacterClaim, assignmentRecorded - filing basis, registration type, and legal-status flags
    • affidavit[] - Section 8/15 affidavits filed
    • proceedings[] - TTAB opposition/cancellation proceeding numbers, when the mark has any
    • internationalRegistrationRefNumbers[] - Madrid Protocol international registration references, when applicable
    • drawingCode, drawingCodeDescription - USPTO drawing code and its description
    • filedDate, registrationDate, firstUseAnyDate, firstUseCommerceDate, priorityDate, abandonDate, cancelDate, publishForOppositionDate, supplementalRegistrationDate
    • sourceUrl - official USPTO TSDR case-status page for this filing
    • recordType: "trademark", scrapedAt

    These are the documented fields. Optional ones can be empty on a given record, so measure how often each field your deliverable depends on is populated across a real sample before automating the handoff.

    How do you build the workflow end to end?

    Open USPTO Trademark Search Scraper and work through these in order. Each step ends with something to check, so a bad configuration surfaces on a small run rather than a scheduled one.

    1. Set the "mode" to "search" and enter a broad "searchQuery" like "coffee" to get a feel for the data volume, leaving "maxItems" at its default.
    2. Review the output to confirm relevant fields like "wordmark", "ownerName", and "goodsAndServices[]" are populated as expected for your use case.
    3. Adjust "maxItems" to a higher value, say 100, and add filters such as "status" to "live" and an "internationalClass" if your initial broad search returned too many irrelevant records.
    4. For specific lookups, switch the "mode" to "bySerialNumber" or "byRegistrationNumber" and input a few known numbers from your initial results, checking the output for accurate matches.
    5. If performing a bulk export, set "maxItems" to its maximum of 500 and configure a filter like "internationalClass" to narrow the scope.
    6. Inspect a few dozen returned records for completeness, especially fields such as "filedDate" and "sourceUrl", to ensure they meet your quality standards before scheduling.

    How do you apply it? Three worked playbooks

    These are USPTO Trademark Search Scraper's own documented use cases, each worked through as an operating pattern rather than a description.

    Use case 1: Trademark clearance searches

    Outcome: Check whether a mark is already registered before filing

    Configure: Set "mode" to "search", input your proposed mark in "searchQuery", and set "status" to "live". Consider adding an "internationalClass" filter if you have a specific class in mind.

    Working method: Start with a broad search of your proposed mark, examining the returned "wordmark" and "status" fields for any direct conflicts. Refine your search by adding phonetic variations or related terms to "searchQuery". Cross-reference potential matches with their "goodsAndServices[]" to assess similarity to your intended use.

    Deliverable: A report detailing existing live trademarks with similar wordmarks or goods/services, along with their serial and registration numbers.

    Stop condition: A run returns 0 live marks for a proposed wordmark, or all returned marks are clearly distinct in wordmark and goods/services.

    Use case 2: Brand protection

    Outcome: Monitor filings by a competitor or by your own company across all classes

    Configure: Set "mode" to "byOwner" with your competitor's or company's name in "ownerName". Set "status" to "live" and leave "internationalClass" and "markType" as "any" for comprehensive coverage.

    Working method: Schedule this Actor to run periodically with your target owner name. Compare the newly returned records with previous runs to identify new filings. Focus on "filedDate" and "wordmark" to track recent activity. Investigate any changes in "status" for existing marks.

    Deliverable: A chronological log of all trademark filings by a specified owner, highlighting new applications, status changes, and key dates.

    Stop condition: The "ownerName" field in the output is consistently empty or returns irrelevant owners, indicating an incorrect query or data source issue.

    Use case 3: Legal research

    Outcome: Bulk-export filings in a given Nice class or goods/services category

    Configure: Set "mode" to "byGoodsServices" and specify a keyword in "goodsAndServicesQuery" (e.g., "coffee"), or set "mode" to "search" and choose a specific "internationalClass" (e.g., "030"). Set "maxItems" to its maximum of 500.

    Working method: Begin by exporting filings for a specific "internationalClass" or a focused "goodsAndServicesQuery" keyword. Review the initial batch of records to ensure they align with your research scope. If the volume is too high, refine your filters or break down the export into multiple runs with narrower criteria.

    Deliverable: A spreadsheet or database of trademark filings within your specified Nice class or goods/services category, including full record detail like owner information and key dates.

    Stop condition: The returned "goodsAndServices[]" descriptions or "internationalClass[]" values for a significant portion of records are outside the intended scope of your research.

    What breaks, and how do you design around it?

    • Over the last 30 days, 1.8% of public runs failed and 0.0% timed out. Build retries and alerting around those rates rather than assuming every run completes.

    When running broad queries that might exceed the maxItems cap of 500, split your request into multiple runs. Use filters like internationalClass or status to narrow down each run's scope. For example, if searching a very common term, you might run separate searches for each relevant international class. If you encounter rate limiting, which is uncommon given the public nature of the USPTO API, consider adding a short delay between batches of lookups in your own orchestration.

    When should you not use USPTO Trademark Search Scraper?

    This Actor is not suitable if you need to extract intellectual property data from regions outside the United States. For European trademarks and designs, you would be better served by the EUIPO Trademark & Design Search Scraper, which targets the official EU Intellectual Property Office. Similarly, if your focus is on patent information rather than trademarks, the USPTO Patent Search Scraper would be the appropriate tool, as this Actor is specifically for trademarks. Furthermore, if your goal is to gather business leads with email and phone numbers, this Actor will not provide that level of detail, as it focuses solely on trademark registration data. In that scenario, a dedicated business directory scraper like the French Business Directory Leads with Emails & Phones would be a more effective alternative. Do not use this Actor for direct integration with payment or legal filing systems, as it is a data extraction tool and not an functional API for transactional purposes.

    What should you check before trusting the output?

    • Watch for records where "status" is present but "statusDescription" is missing or malformed, as this can indicate incomplete data.
    • Check that array fields like "internationalClass[]" and "ownerName[]" contain expected values and are not empty when other related fields are populated.
    • Ensure that date fields such as "filedDate" and "registrationDate" are consistently formatted and present for relevant records.
    • Verify that "sourceUrl" links correctly to the USPTO TSDR case-status page for a sample of records.
    • Look for discrepancies between "wordmark" and "wordmarkPseudoText[]", as phonetic variations might be important for your analysis.
    • Confirm that "goodsAndServices[]" contains relevant and complete descriptions, especially when using mode=byGoodsServices.

    None of this proves a record is correct. It gives a scheduled USPTO Trademark Search Scraper run defined points where it should stop instead of quietly passing bad data downstream.

    Frequently asked questions

    What is the cost of using this USPTO Trademark Search Scraper?

    Each result from this Actor costs $0.005 on Apify's free plan, which translates to $5.00 per 1,000 results. Apify's free plan provides $5.00 of monthly usage credit, allowing you to extract up to 1,000 results without needing a credit card. Remember that platform usage and a run-start fee are billed separately, so monitor your consumption. For paid Apify plans, the per-result cost is lower. This pricing structure helps you scale your operations efficiently.

    How fresh is the data returned by the scraper?

    The data reflects the USPTO's live trademark search index at the exact moment the Actor runs. This means you are always getting the most current information available from tmsearch.uspto.gov. The Actor does not cache results, ensuring that status changes, new filings, or updates to existing records are reflected in your output immediately. For time-sensitive legal research or brand monitoring, this real-time data access is crucial. Ensure your workflow accounts for potential changes between runs.

    Can I search for trademarks by the owner's name?

    Yes, you can search for trademarks by the owner's or applicant's name. Set the mode input to byOwner and provide the desired name in the ownerName field. This feature is particularly useful for brand protection or competitor analysis, allowing you to track all filings associated with a specific entity. You can further refine your search by filtering for live or dead statuses to focus on active or historical records as needed. This helps narrow down large result sets.

    What does internationalClass mean in the output?

    The internationalClass field refers to the Nice Classification system, which categorizes goods and services into 45 international classes. Additionally, there are special classes for certification marks (A, B) and collective membership marks (200). For example, class 025 covers clothing, while class 035 relates to advertising and business services. This classification helps in organizing and searching for trademarks based on the type of goods or services they represent. You can use the internationalClass filter in the inputs to restrict your search to specific classes.

    Why might a trademark record not have a registrationNumber?

    A trademark record may not have a registrationNumber if the application has not yet proceeded to full registration, or if it has been abandoned. Only applications that successfully complete the registration process receive a registration number. Pending applications or those that have been abandoned, canceled, or expired will typically only have a serialNumber. This distinction is important for understanding the current legal status of a trademark, as indicated by the status and statusDescription fields in the output.

    Where to go next

    When you are ready to run it, open USPTO Trademark Search Scraper on Apify; the free plan covers up to 1,000 results a month.

    Other Actors we maintain for related data:

    Resources

    • Actor documentation, input schema, and pricing: verified against the published Actor on 2026-10-01.

    • Actor last updated by its maintainers on 2026-07-04.

    • Run outcome figures cover the 30 day public window ending 2026-10-01.

    • USPTO Trademark Search Scraper on Apify

    Featured actors

    USPTO Trademark Search Scraper

    Search official US trademark registrations from the USPTO Trademark Search system (tmsearch.uspto.gov). Search by wordmark, owner name, goods/services, serial number, or registration number. Filter by live/dead status and Nice international class (1-45).

    Run on Apify ↗