Skip to main content
GET
/
v1
/
goods-services
List Goods & Services
curl --request GET \
  --url https://api.signa.so/v1/goods-services \
  --header 'Authorization: Bearer <token>'
{
  "object": "list",
  "data": [
    {
      "term": "downloadable mobile applications",
      "term_key": "tmc_downloadable_mobile_applications",
      "class_number": 9,
      "taxonomy_path": "Goods > Class 9 > Software",
      "is_harmonised": true,
      "accepted_offices": ["uspto", "euipo", "wipo", "cipo"],
      "source": "tmclass",
      "language": "en"
    }
  ],
  "has_more": false,
  "pagination": { "cursor": null },
  "request_id": "req_xyz"
}

Overview

Browse and search 96,000+ pre-approved goods & services descriptions from the Harmonised Database (HDB) and the USPTO ID Manual. Use this to power goods/services autocomplete in filing tools (pass class to scope results to a single Nice class), or to discover which classes accept a particular term (pass q without class for a cross-class search). For background on how office acceptance works and the data sources behind this endpoint, see the Classifications & Goods/Services guide.
At least one of q or class must be provided. For semantic class discovery from a natural-language business description (e.g. “SaaS tool for HR teams”), use Suggest Classifications. For a drafted goods/services specification with filing-ready wording per class, use Suggest Goods & Services.

Query Parameters

q
string
Substring search across term text (2-200 characters). Optional if class is set. Returns 400 validation_error if neither q nor class is provided.
class
integer
Nice class number (1-45). Optional if q is set. Returns 400 if outside the 1-45 range, or 404 if the class number is in range but not loaded in reference data.
language
string
default:"en"
Language code (e.g. en, de, fr, es, it, ja).
harmonised_only
boolean
default:"false"
When true, only return terms accepted by all offices (TMClass harmonised list).
limit
integer
default:"20"
Max results (1-100).

Response

data
object[]
Array of term records ranked by best match.
data[].term
string
The term text.
data[].term_key
string
Stable identifier for the term.
data[].class_number
integer
Nice class this term is filed under (1-45). Present on every result so cross-class searches render without follow-up fetches.
data[].taxonomy_path
string
TMClass taxonomy path.
data[].is_harmonised
boolean
Whether the term is on the harmonised list.
data[].accepted_offices
string[]
Office codes that accept this term.
data[].source
string
Source database (e.g. tmclass).
data[].language
string
Language code.
{
  "object": "list",
  "data": [
    {
      "term": "downloadable mobile applications",
      "term_key": "tmc_downloadable_mobile_applications",
      "class_number": 9,
      "taxonomy_path": "Goods > Class 9 > Software",
      "is_harmonised": true,
      "accepted_offices": ["uspto", "euipo", "wipo", "cipo"],
      "source": "tmclass",
      "language": "en"
    }
  ],
  "has_more": false,
  "pagination": { "cursor": null },
  "request_id": "req_xyz"
}

Code Examples

Scoped autocomplete (user already picked a class)

curl -G "https://api.signa.so/v1/goods-services" \
  -H "Authorization: Bearer sig_YOUR_KEY_HERE" \
  --data-urlencode "q=mobile applications" \
  --data-urlencode "class=9" \
  --data-urlencode "harmonised_only=true" \
  --data-urlencode "limit=10"

Cross-class discovery (which classes accept this term?)

Pass only q (omit class) and inspect class_number on each result to see which classes contain the wording.
curl -G "https://api.signa.so/v1/goods-services" \
  -H "Authorization: Bearer sig_YOUR_KEY_HERE" \
  --data-urlencode "q=poster" \
  --data-urlencode "limit=25"

Browse all terms in a class

Pass only class (omit q) to page through the full list of accepted wording for one class.
TypeScript
let page = await signa.goodsServices.list({ class: 25, limit: 50 });
for (const t of page.data) console.log(t.term);
while (page.has_more) {
  page = await page.next();
  for (const t of page.data) console.log(t.term);
}

Errors

StatusTypeDescription
400validation_errorNeither q nor class provided, q shorter than 2 characters, or class outside the 1-45 range
401unauthorizedMissing or invalid API key
403forbiddenAPI key lacks trademarks:read scope
404not_foundclass is in range but not loaded in reference data