{
  "openapi": "3.0.1",
  "info": {
    "title": "Trademark Search — USPTO, EUIPO, Nice Classification (TMview)",
    "description": "Search registered trademarks across 70+ national and regional offices (USPTO, EUIPO, UK, DE, JP, WIPO and more) via the official TMview database. 22 fields incl. status, Nice classes, applicant, expiration & opposition dates, seniority claim and mark image. From $0.002/result, no start fee.",
    "version": "0.1",
    "x-build-id": "7Eczm8IneL6c8GJE0"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fetchsmith~trademark-search-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fetchsmith-trademark-search-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/fetchsmith~trademark-search-scraper/runs": {
      "post": {
        "operationId": "runs-sync-fetchsmith-trademark-search-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/fetchsmith~trademark-search-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-fetchsmith-trademark-search-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "searchTerm": {
            "title": "Trademark term",
            "type": "string",
            "description": "Word or brand to search for. Matches trademarks whose name contains this term (see Match mode for a whole-word match or an ends-with-these-letters match instead).",
            "default": "coffee"
          },
          "matchMode": {
            "title": "Match mode",
            "enum": [
              "contains",
              "startsWithPrefix",
              "startsWith",
              "endsWith"
            ],
            "type": "string",
            "description": "How 'Trademark term' is matched against each trademark's name. 'Contains' (default) matches the term anywhere, as a plain substring -- no word boundary, so \"solar\" also matches \"SOLARWINDS\". 'Starts with these letters' (value startsWithPrefix) is the TRUE prefix mode and the right one for brand clearance: it keeps only marks whose name BEGINS with your term, including inside a longer word -- \"coff\" returns \"COFFEE\" and \"Coff Chi\" but not \"HAIR SYRUP coff\". TMview itself has no prefix search, so this mode asks it for 'contains' and filters the rest out here: rejected marks are never charged, but the run reads more pages per delivered row, so allow 300s+ (Input > Run options) on a broad term, and note that the match total in the log/RUN_SUMMARY is then TMview's wider pre-filter 'contains' total. 'Whole word anywhere' (value startsWith) requires the term to be a COMPLETE word in the name, at any position -- verified live cycle 2500: \"syrup\" returns \"SYRUP\", \"HAIR SYRUP\" and \"Coff Syrup\" alike, while \"coff\" returns \"Coff Chi\"/\"COFF STOP\" and NOT \"COFFEE\" (a prefix of a longer word is not a word). 'Ends with these letters' (value endsWith) is a plain suffix substring, no word boundary at all -- \"offee\" returns \"toffee\", \"woffee\" and \"COFFEE\". NOTE the names startsWith/endsWith are historical and describe neither behaviour exactly; use startsWithPrefix (not startsWith) when you mean \"begins with\".",
            "default": "contains"
          },
          "offices": {
            "title": "Trademark offices",
            "type": "array",
            "description": "Two-letter office codes to search, e.g. US (USPTO), EM (EUIPO), GB, DE, FR, JP, CN, WO (WIPO). Case-insensitive -- a lowercase or mixed-case code is corrected for you (TMview itself matches office codes case-sensitively). TMview covers exactly 81 offices; a code outside that set (e.g. \"UK\" instead of \"GB\", or \"EU\" instead of \"EM\") matches no trademark at all, so the run warns and tells you in its status message instead of just returning an empty dataset. Leave empty to search all 81 offices in TMview.",
            "default": [
              "US",
              "EM"
            ],
            "items": {
              "type": "string"
            }
          },
          "niceClasses": {
            "title": "Nice classes",
            "type": "array",
            "description": "Restrict to these Nice classification classes, e.g. \"25\" (clothing), \"9\" (software). The Nice Classification has 45 classes (1-34 goods, 35-45 services); zero-padded forms like \"09\" work too. A value outside 1-45 matches no trademark at all, so the run warns and tells you in its status message instead of just returning an empty dataset. Leave empty for all classes.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "statuses": {
            "title": "Trademark status",
            "type": "array",
            "description": "Restrict to these statuses. TMview recognises exactly four values: Registered, Filed, Ended, Expired. Any differently-cased match (e.g. \"registered\") is corrected for you automatically. A value that isn't one of the four at all (e.g. \"Opposed\", \"Pending\", \"Withdrawn\" -- TMview has no such statuses) matches no marks, so the run warns and tells you in its status message instead of just returning an empty dataset. Leave empty for all statuses.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "tmTypes": {
            "title": "Trademark type",
            "type": "array",
            "description": "Restrict to these mark types, e.g. \"Word\" or \"Figurative\". 10 values are live-confirmed to work: Word, Combined, Figurative, Undefined, Other, Stylized characters, Colour, 3-D, Hologram, Position. Unlike offices/Nice classes/status, this list is known to be incomplete (the 10 confirmed values do not add up to the full unfiltered count), so a value outside this list is still sent to TMview as-is rather than rejected -- it may be a real type this Actor just hasn't confirmed yet. Case-insensitive; TMview's own casing is corrected for you. Leave empty for all types.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Stop after this many trademarks.",
            "default": 50
          },
          "watchLabel": {
            "title": "Watch label",
            "type": "string",
            "description": "Optional label that turns on watch mode: the first run under a label seeds a baseline and returns nothing (charged nothing); every run after that returns and charges only marks not already delivered under that label. Leave unset for a plain, repeatable search.",
            "default": ""
          },
          "watchChanges": {
            "title": "Watch mode: also alert on status changes",
            "type": "boolean",
            "description": "Only used together with Watch label. When on, a run also re-delivers a mark you already have if its status has changed since you last saw it -- e.g. Filed -> Registered, or a move into Ended/Expired -- instead of only ever reporting brand-new filings. Charged at the same per-row price as a new mark. Each changed row is tagged with `_watchChangeType: [\"status\"]` plus the previous value under `_watchPrevious`. Off by default so existing watches keep their current behaviour. IMPORTANT: do not combine this with the Trademark status filter above -- that is a server-side filter on the very field this option watches, so a mark whose status moves out of your filter stops matching the search and its change can never be reported. The run warns you if you do; see the README FAQ \"don't filter on the field you're watching\".",
            "default": false
          },
          "webhookUrl": {
            "title": "Webhook URL (notify on completion)",
            "type": "string",
            "description": "Optional. An http(s) URL to POST a small JSON summary to when the run finishes — marks pushed, marks scanned, and (when Watch label is set) whether this was a baseline run plus the new/skipped counts, along with the run's dataset ID so you can fetch the results. A convenience for callers who want a completion ping without setting up an Apify platform webhook (which needs separate Console/API configuration per Task, not per run). Best-effort: a failed or slow webhook is logged as a warning and never fails the run or affects charging — it fires after every mark has already been pushed and charged. Leave empty to skip."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}