# Mexico Trademark Search (IMPI MARCia) (`jpmendes/mexico-trademark-search-impi`) Actor

Search the official Mexican trademark register (IMPI MARCia, formerly Marcanet) by name, owner or number. Spanish phonetic similarity score (b/v, c/s/z, ll/y, mute h), Nice class, status and filing-date filters, full details and watch mode.

- **URL**: https://apify.com/jpmendes/mexico-trademark-search-impi.md
- **Developed by:** [Engenho Labs](https://apify.com/jpmendes) (community)
- **Categories:** Business, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 trademarks

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

## Mexico Trademark Search (IMPI MARCia)

Check any brand name against the **official Mexican trademark register** of IMPI (Instituto Mexicano de la Propiedad
Industrial), straight from **MARCia**, the IMPI search that replaced **Marcanet**. Close to 1 million registered and
pending records, live data (applications filed weeks ago already show up).

What makes it different: every hit gets a **similarity score tuned for Spanish** ("Vella Ziudad" vs "BELLA CIUDAD"
scores 97), and the Actor also searches **same-sounding spellings** (b/v, z/s/c, ll/y, k/qu/c, h) that IMPI's own
word-by-word search ranks too low. You see at a glance which marks are a real risk before you pay a non-refundable
IMPI filing fee.

**It also catches IMPI's dead applications.** MARCia keeps showing abandoned, denied and withdrawn applications as
"EN TRÁMITE" (pending) forever: TACOS EL GUERO, expediente 518859, was filed in 2001, abandoned in the 2003 Gaceta,
and still reads "EN TRÁMITE" today. Other tools pass that on as a live conflict; this Actor flags it as
`likelyInactive` and, with full details, confirms it from IMPI's own Gaceta notices and office actions
(`status: "inactive"`, `inactiveReason`, `inactiveDate`), so a 20-year-old abandoned filing does not scare you off a
free name.

No login, no CAPTCHA, no browser: the Actor uses the same JSON service as the MARCia website, at a polite pace (one
request per second).

### What it does

| Input | You get |
|---|---|
| **Trademark names** | Similar marks ranked by a Spanish phonetic + textual similarity score (0–100), best first. Filter with `minSimilarity`. |
| **Owners** | Every trademark whose applicant/holder contains the phrase, e.g. `grupo bimbo`. |
| **Application or registration numbers** | The record of each expediente or registration number (or MARCia id such as `RM200901052179`). |

Filters (applied by IMPI, so they work on any number of hits): **Nice classes**, **status** (registered / pending),
**filing date** (`filedAfter`, `filedBefore`, absolute or relative such as `30 days`), plus **exclude expired** marks.

Each record includes the application (expediente) and registration numbers, the mark name, status (normalized and
original IMPI text), an `expired` flag, a `likelyInactive` flag, application type, owners, filing, publication,
first-use and expiry dates, the logo image URL and a link to the record on MARCia.

Turn on **Include full details** to also get the Nice classes, goods and services per class, owner country (and
address for companies), Vienna codes, priority claims, the procedure history (office actions and filings), the
registration date, and the confirmed end of dead applications (`status: "inactive"`).

### How the similarity score works

| Score | Meaning | Example (search "Bimbo" / "Vella Ziudad") |
|---|---|---|
| 100 | Same name | BIMBO |
| 97 | Same sound, different spelling (b/v, c/s/z, ll/y, qu/k, mute h, double letters, accents) | BELLA CIUDAD |
| 90 | Your name appears as whole words inside a longer mark | BIMBO RINDE, DON DON BIMBO |
| 70–89 | Close spelling | BOMBO CREPAS (72) |
| below 70 | Usually noise, dropped by default | BAMBU COFFEE (55) |

Similarity is always the main order. Ties are broken in favour of live marks (not expired, not inactive or likely
inactive), then shorter names.

IMPI's similar search matches word by word and ranks by its own relevance, so a differently spelled mark can sit
beyond the first pages. With `spellingVariants` on (default), the Actor also runs up to two searches with alternative
Spanish spellings of your name (for "Vella Ziudad": "BELLA ZIUDAD" and "VELLA CIUDAD") and merges the hits before
scoring. The score is a screening tool, not legal advice.

### Use cases

- **Trademark clearance in Mexico** before launching a brand or filing at IMPI. If nothing comes back above your
  threshold, that is the answer you need.
- **Trademark watch.** Schedule a daily or weekly run with `watchMode` and `filedAfter: "30 days"`. You only get new
  filings or status changes that look like your brand.
- **Portfolio audits and due diligence.** List every mark a company owns, with expiry dates for renewals.
- **IP law firms and agencies.** Find recent filings in a Nice class, or registrations that already expired.
- **AI agents and pipelines** that need a Mexico trademark lookup as a tool: clean JSON with English field names.

### Input example

```json
{
  "names": ["Bimbo", "Vella Ziudad"],
  "matchMode": "similar",
  "minSimilarity": 70,
  "owners": ["grupo bimbo"],
  "numbers": ["1052179"],
  "maxResults": 50,
  "niceClasses": ["30"],
  "status": ["pending"],
  "filedAfter": "2025-01-01",
  "includeDetails": true
}
```

### Output example (one item per trademark; real data, history shortened)

```json
{
  "query": "Bimbo",
  "queryType": "name",
  "rank": 1,
  "similarity": 90,
  "id": "RM202603702303",
  "applicationNumber": "3702303",
  "registrationNumber": null,
  "name": "BIMBO RINDE",
  "status": "pending",
  "statusOriginal": "EN TRÁMITE",
  "expired": false,
  "applicationType": "REGISTRO DE MARCA",
  "owners": ["GRUPO BIMBO, S.A.B. DE C.V."],
  "filingDate": "2026-09-10",
  "publicationDate": "2026-09-18",
  "likelyInactive": false,
  "statusNote": null,
  "firstUseDate": null,
  "registrationDate": null,
  "expiryDate": null,
  "imageUrl": "https://marcia.impi.gob.mx/marcas/image/RM202603702303",
  "marciaUrl": "https://marcia.impi.gob.mx/marcas/search/details/RM202603702303",
  "niceClasses": [30],
  "goodsAndServices": [{"niceClass": 30, "description": "PAN"}],
  "ownerDetails": [{"name": "GRUPO BIMBO, S.A.B. DE C.V.", "country": "MEXICO", "address": "PROLONGACIÓN PASEO DE LA REFORMA NUM. EXT. 1000, PEÑA BLANCA SANTA FE"}],
  "viennaCodes": ["19.03.05", "08.01.02"],
  "priorityClaims": [],
  "history": [{"procedure": "SOLICITUD DE REGISTRO", "startDate": "2026-09-10", "concludedDate": null,
               "officeActions": [{"description": "RESULTADO DEL EXAMEN FIGURATIVO", "date": "2026-09-22", "number": "20261486012"}],
               "filings": []}],
  "retrievedAt": "2026-11-05T14:30:12+00:00"
}
```

`status` is `registered` (REGISTRADO), `pending` (EN TRÁMITE), `inactive` (only with full details, see below) or
`other`; `statusOriginal` always keeps IMPI's own text. IMPI keeps many lapsed registrations as REGISTRADO;
`expired: true` tells you the expiry date has passed.

#### Abandoned applications that IMPI still shows as pending

IMPI never updates the search status of an application that dies before registration: abandoned, denied and
withdrawn applications stay "EN TRÁMITE" for decades. The Actor corrects that in two steps:

| Field | When | Meaning |
|---|---|---|
| `likelyInactive` | always | `true` for a pending application filed more than 3 years ago that never got a registration number (almost always abandoned or denied), and for any mark confirmed `inactive`. |
| `statusNote` | when relevant | Plain-English explanation of the above, or `null`. |
| `status: "inactive"` | full details | Confirmed from the record: a Gaceta notice ("Solicitudes Abandonadas", "Negadas"...), an office action of the application ("Se considera abandonado el trámite..."), or an application concluded without registration. |
| `inactiveReason` | full details | `abandoned`, `denied`, `withdrawn`, `lapsed`, `cancelled`, `annulled` or `concluded_without_registration`. |
| `inactiveDate` | full details | Date of the notice or office action (YYYY-MM-DD), when IMPI gives one. |

Example, search "Tacos El Guero" with full details: expediente 518859 (filed 2001-10-25) comes back as
`status: "inactive"`, `inactiveReason: "abandoned"`, `inactiveDate: "2003-11-28"`, `statusOriginal: "EN TRÁMITE"`.

`firstUseDate` is the date of first use declared in the application (MARCia labels it as a registration date, but on
the 2001 application above it is 1991). The real `registrationDate` comes only with full details. With `watchMode`, items also carry
`watchEvent`: `new` or `changed`. Number lookups carry `matchedOn` (`applicationNumber` or `registrationNumber`).

The **SUMMARY** record in the key-value store lists, for every query, the total hits in IMPI and how many items were
returned, including queries with no match at all.

### Pricing

You pay per trademark returned. You are **never charged for errors** (invalid input, IMPI outage) nor for queries with
no match; errors go to the `ERRORS` record in the key-value store.

| Event | Price |
|---|---|
| Trademark | $0.002 |
| Trademark with full details | $0.006 |

A clearance check of one name with the 20 closest marks costs $0.04, or $0.12 with full details.

### Watch mode

With `watchMode` on, the Actor remembers (in a named key-value store) the marks each query returned and on later runs
outputs only new marks or marks whose status, expiry date or registration number changed, including a pending
application that becomes likely inactive or is confirmed inactive. The first run returns the
current set. Changing the query or its filters starts a new watch list.

### Coverage and limits

- Source: IMPI MARCia (marcia.impi.gob.mx), registered and pending marks, trade names and advertising slogans.
- MARCia pages through at most the first 10,000 hits of a search; use filters to narrow very common words.
- The Actor keeps a gentle pace (1 request/second) and retries when IMPI is busy, so very large runs take time:
  about 5–10 seconds per name or owner, plus 1 second per trademark when full details are on.
- This Actor is not affiliated with IMPI. Data is provided as published by IMPI; the official record prevails.

### Privacy

When the owner is an individual, only the name and country are returned, never the address. E-mail addresses,
names of people who received notifications and links to scanned documents are always removed.

### En español

**Búsqueda de marcas en México (IMPI MARCia / Marcanet).** Consulta el registro oficial del IMPI por denominación,
titular o número de expediente/registro. Cada resultado trae un **puntaje de similitud fonética en español** (b/v,
c/s/z, ll/y, h muda, qu/k) y también se buscan las grafías que suenan igual, para saber qué marcas parecidas son un
riesgo antes de pagar la tarifa del IMPI.
**Detecta solicitudes muertas:** MARCia muestra como "EN TRÁMITE" para siempre las solicitudes abandonadas, negadas
o desistidas (TACOS EL GUERO, expediente 518859, de 2001, abandonada en la Gaceta de 2003). El Actor las marca con
`likelyInactive` (en trámite hace más de 3 años y sin número de registro) y, con detalles completos, lo confirma con
los avisos de la Gaceta y los oficios del IMPI (`status: "inactive"`, `inactiveReason`, `inactiveDate`); a igual
similitud, las marcas vivas van primero. `firstUseDate` es la fecha de primer uso (no la de registro).
Filtros por clase de Niza, estatus (registrada / en trámite) y fecha de solicitud; detalles completos (productos y
servicios, Viena, historial de trámites) y **modo vigilancia** para recibir solo solicitudes nuevas parecidas a tu
marca. Pagas solo por marca encontrada; los errores no se cobran. Es una herramienta de búsqueda, no una opinión
legal.

# Actor input Schema

## `names` (type: `array`):

Brand names to check against the Mexican register. Hits are ranked by a Spanish phonetic + textual similarity score: 'Vella Ziudad' vs 'BELLA CIUDAD' scores 97.

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

Candidate retrieval in MARCia before our ranking. 'Similar' is the best default for clearance; 'Similar plus' casts a wider net; 'Contains' finds the name inside longer marks; 'Exact' only the same words.

## `minSimilarity` (type: `integer`):

Name searches only. Drop hits scoring below this (0–100). 70 keeps real risks such as the name inside a longer mark (90) or a same-sounding spelling (97); use 0 to keep everything IMPI returned.

## `spellingVariants` (type: `boolean`):

Name searches only. IMPI's similar search works word by word, so a mark spelled differently (b/v, z/s/c, ll/y, k/qu/c, h) can rank too low to be fetched. When on, up to 2 extra searches with alternative Spanish spellings are run and merged; similarity is always scored against the name you typed. Adds a few seconds per name, no extra charge.

## `owners` (type: `array`):

Company or person names. Returns trademarks whose owner contains the whole phrase, e.g. 'grupo bimbo'.

## `numbers` (type: `array`):

IMPI expediente (application) or registration numbers, e.g. 1052179, or MARCia ids such as RM200901052179.

## `maxResults` (type: `integer`):

Most trademarks returned (and billed) for each name or owner (1–1000).

## `niceClasses` (type: `array`):

Optional (1–45). Keep only trademarks covering at least one of these classes. Applied by IMPI, so it works with any number of hits.

## `status` (type: `array`):

Optional. 'registered' (REGISTRADO) and/or 'pending' (EN TRÁMITE). Empty = both. IMPI also shows abandoned and denied applications as EN TRÁMITE: check likelyInactive in the results (and status 'inactive' with full details).

## `filedAfter` (type: `string`):

Optional application-date filter: YYYY-MM-DD or a relative period such as '30 days' or '2 weeks' (handy for scheduled watch runs).

## `filedBefore` (type: `string`):

Optional: YYYY-MM-DD or a relative period such as '7 days'.

## `excludeExpired` (type: `boolean`):

IMPI keeps showing many lapsed marks as REGISTRADO. Turn on to drop registered marks whose expiry date has passed (they still appear with expired: true otherwise).

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

Adds Nice classes, goods and services, owner country (and address for companies), Vienna codes, priority claims, procedure history and the registration date, and confirms whether an application IMPI still shows as EN TRÁMITE was abandoned, denied or withdrawn (status 'inactive' with inactiveReason and inactiveDate). One extra request per trademark, billed as 'trademark with details'.

## `watchMode` (type: `boolean`):

Remembers what previous runs with the same query and filters returned and outputs only new trademarks or status/expiry changes (watchEvent: new/changed). Schedule the Actor to get alerts on new filings.

## Actor input object example

```json
{
  "names": [
    "Bimbo"
  ],
  "matchMode": "similar",
  "minSimilarity": 70,
  "spellingVariants": true,
  "maxResults": 50,
  "excludeExpired": false,
  "includeDetails": false,
  "watchMode": false
}
```

# Actor output Schema

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

One item per trademark found, best match first for name searches (live marks ahead of inactive ones at equal similarity). Status registered/pending/inactive/other, likelyInactive for applications IMPI still shows as EN TRÁMITE years after they were abandoned, firstUseDate, filing and expiry dates.

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

Total hits in IMPI and items returned for each query, including queries with no match (not billed).

## `errors` (type: `string`):

Queries that failed or had invalid input. Present only when there were errors; these are not charged.

# 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 = {
    "names": [
        "Bimbo"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpmendes/mexico-trademark-search-impi").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 = { "names": ["Bimbo"] }

# Run the Actor and wait for it to finish
run = client.actor("jpmendes/mexico-trademark-search-impi").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 '{
  "names": [
    "Bimbo"
  ]
}' |
apify call jpmendes/mexico-trademark-search-impi --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jpmendes/mexico-trademark-search-impi"
        }
    }
}
```

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/u3ePYhZJfkCv2dzl6/builds/9Q3XRPABHjyUxCsaf/openapi.json
