---
title: "Search"
method: GET
path: "/search"
tags: ["Search"]
---

# Search

`GET /search`

## Request

- Base URL: `https://api.markmesh.com/v1`
- URL: `https://api.markmesh.com/v1/search`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer

Synchronous query across one or more trademark offices in a single call. Returns a merged result list plus per-office meta showing which offices succeeded, failed, or timed out. Defaults to `EU,DE` if `offices` is omitted, so a bare call never fans out to every adapter.

Sandbox routing follows the calling key: `mm_test_*` queries each office's sandbox endpoint (deterministic fixtures), `mm_live_*` queries the production office. The same search engine backs the MarkMesh dashboard's search page — results are identical.

## Query parameters

- `q` string, required
- `offices` string
- `limit` integer

## Response `200`

Merged result list with per-office meta

- object
  - `data` object[], required: Merged trademark matches across all queried offices, in office-return order (no global sort).
    - `application_number` unknown
    - `colour_claim` unknown
    - `expiry_date` string, date: ISO 8601 date (e.g. `2025-03-14`).
    - `filing_date` string, date: ISO 8601 date (e.g. `2025-03-14`).
    - `mark_text` unknown
    - `mark_type` unknown
    - `nice_classes` integer[]: Nice Classification class numbers (1-45).
    - `office` string: Office identifier (lowercase, e.g. `euipo`, `dpma`, `uspto`).
    - `owner_name` unknown
    - `publication_date` string, date: ISO 8601 date (e.g. `2025-03-14`).
    - `publication_number` unknown
    - `registration_date` string, date: ISO 8601 date (e.g. `2025-03-14`).
    - `registration_number` unknown
    - `representative_name` unknown
    - `status` unknown
    - `vienna_classes` string[]: Vienna Classification codes for figurative elements (e.g. `27.05.01`).
  - `meta` object, required
    - `country_codes` string[], required: Country codes resolved from the `offices` parameter (after defaulting). Tells you which set actually fanned out, useful for debugging unexpected results.
    - `local_index` 'ok' | 'unavailable' | 'not_queried': One of `ok`, `unavailable`, `not_queried`. Whether the MarkMesh index — where most results come from — answered. `unavailable`: it could not be queried and `data` holds only what the live office queries returned, a partial answer; retry for the full one. `not_queried`: the term is a recent known miss and was answered without a fresh query.
    - `offices_failed` object[], required: Per-office error reports for adapters that returned a non-timeout error. Their matches are excluded from `data`. The `reason` is the adapter's internal error code (e.g. `auth_required`, `all_fallbacks_exhausted`, `rate_limited`) — useful for triaging whether to retry, narrow `offices`, or check credentials.
      - `office` string, required: Office identifier (lowercase).
      - `reason` string, required: Short error code from the adapter.
    - `offices_queried` string[], required: Office identifiers the request was dispatched to.
    - `offices_succeeded` string[], required: Office identifiers that returned results (possibly an empty list of matches).
    - `offices_timed_out` string[], required: Office identifiers whose adapter exceeded the per-office timeout budget. Re-issuing the same query may still hit the slow office — consider narrowing `offices`.
    - `term` string, required: The trimmed search term that was actually used.

## Other responses

- `400`: Malformed request
- `401`: API key or session credential missing, invalid, expired, or revoked
- `503`: `search_unavailable` — the MarkMesh index could not be queried and the office queries returned no hits, so there is no answer to give (an empty list would wrongly read as no such marks). Retry shortly.

---

[API](https://skmtc.dev/markmesh/apis/markmesh-api.md) · [All operations](https://skmtc.dev/markmesh/apis/markmesh-api/llms.txt) · [OpenAPI document](https://skmtc.dev/markmesh/apis/markmesh-api/revisions/87d08d2479ee?raw)
