Skip to main content
POST
/
v1
/
goods-services
/
suggest
Suggest Goods & Services
curl --request POST \
  --url https://api.signa.so/v1/goods-services/suggest \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "description": "<string>",
  "jurisdiction_code": "<string>",
  "class_number": 123
}
'
{
  "object": "goods_services_suggestion",
  "query": "e-commerce company selling sneakers",
  "classifier_version": "classify-v1.0",
  "classes": [
    {
      "class_number": 25,
      "title": "Clothing, footwear, headwear",
      "confidence": "high",
      "rank": 1,
      "recommendation_type": "core",
      "conditional_on": null,
      "rationale": "Sneakers are athletic footwear, squarely in class 25.",
      "accepted_terms": [
        {
          "term": "Sneakers",
          "source": "uspto_idm",
          "accepted_offices": ["USPTO", "EUIPO", "JPO", "KIPO", "CNIPA"],
          "harmonised": true
        },
        {
          "term": "Athletic shoes",
          "source": "uspto_idm",
          "accepted_offices": ["USPTO", "EUIPO", "JPO", "KIPO", "CNIPA"],
          "harmonised": true
        }
      ]
    },
    {
      "class_number": 35,
      "title": "Advertising, business, retail services",
      "confidence": "medium",
      "rank": 2,
      "recommendation_type": "conditional",
      "conditional_on": "brand used for the storefront, not only the products",
      "rationale": "Operating an online store is retail services.",
      "accepted_terms": []
    }
  ],
  "ambiguous": false,
  "clarification_question": null,
  "request_id": "req_abc123"
}

Overview

Draft a goods/services specification from a natural-language description. Returns ranked Nice classes with filing-ready wording per class, grounded in the pre-approved catalog (Harmonised Database + USPTO ID Manual). Every term in the response is an actual accepted term — no LLM-invented wording. Use this to power:
  • Filing wizards that auto-draft the goods/services block of an application
  • Attorney drafting tools
  • Multi-class application flows where each class is a separate line item
Just need the class numbers (no wording)? Use Suggest Classifications instead — same input, lighter response, billed at 1 unit.
Pass class_number in the body to restrict the response to a single, already-chosen class — useful when you’re refining wording inside a class the user has already picked. For background on Nice classes and office acceptance, see the Classifications and Goods/Services guide.

Body Parameters

description
string
required
Description of the goods, services, or business (3-500 characters). Natural-language, no special format.
jurisdiction_code
string
Optional ISO-3166-1 alpha-2 jurisdiction code (e.g. US, EU, GB). Biases retail-vs-product interpretation toward local practice.
class_number
integer
Optional Nice class (1-45). When set, scopes the response to that single class — useful for refining wording when the class has already been chosen.

Response

object
string
Always goods_services_suggestion.
query
string
The description you submitted, echoed back.
classifier_version
string
Version tag of the classifier that produced this response.
classes
object[]
Ranked suggested classes, each with filing-ready accepted terms.
classes[].class_number
integer
Nice class number (1-45).
classes[].title
string
Canonical class title.
classes[].confidence
string
One of high, medium, or low.
classes[].rank
integer
1-indexed position in the returned ordering.
classes[].recommendation_type
string
One of core, conditional, or adjacent.
classes[].conditional_on
string
When recommendation_type is conditional, the condition under which this class applies. May be null.
classes[].rationale
string
Short explanation of why this class was suggested.
classes[].accepted_terms
object[]
Paste-ready goods/services terms for this class. Each is drawn from the pre-approved catalog — terms the LLM hallucinates never appear here.
ambiguous
boolean
true when the description has two or more materially different filing strategies.
clarification_question
string
When ambiguous is true, a question to ask the user. May be null.
Each item in accepted_terms has this shape:
FieldTypeDescription
termstringThe canonical term text.
sourcestringSource catalog (tmclass, uspto_idm, manual).
accepted_officesstring[]Office codes that accept this term.
harmonisedbooleanWhether the term is on the TMClass harmonised list.
{
  "object": "goods_services_suggestion",
  "query": "e-commerce company selling sneakers",
  "classifier_version": "classify-v1.0",
  "classes": [
    {
      "class_number": 25,
      "title": "Clothing, footwear, headwear",
      "confidence": "high",
      "rank": 1,
      "recommendation_type": "core",
      "conditional_on": null,
      "rationale": "Sneakers are athletic footwear, squarely in class 25.",
      "accepted_terms": [
        {
          "term": "Sneakers",
          "source": "uspto_idm",
          "accepted_offices": ["USPTO", "EUIPO", "JPO", "KIPO", "CNIPA"],
          "harmonised": true
        },
        {
          "term": "Athletic shoes",
          "source": "uspto_idm",
          "accepted_offices": ["USPTO", "EUIPO", "JPO", "KIPO", "CNIPA"],
          "harmonised": true
        }
      ]
    },
    {
      "class_number": 35,
      "title": "Advertising, business, retail services",
      "confidence": "medium",
      "rank": 2,
      "recommendation_type": "conditional",
      "conditional_on": "brand used for the storefront, not only the products",
      "rationale": "Operating an online store is retail services.",
      "accepted_terms": []
    }
  ],
  "ambiguous": false,
  "clarification_question": null,
  "request_id": "req_abc123"
}

Billing

Billed as 2 units (check endpoint type).

Code Examples

Full draft (let the classifier pick the classes)

curl -X POST "https://api.signa.so/v1/goods-services/suggest" \
  -H "Authorization: Bearer sig_YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{
    "description": "e-commerce company selling sneakers",
    "jurisdiction_code": "US"
  }'

Refine wording for a known class

Pass class_number when the applicant has already decided which class to file under and only needs the wording.
TypeScript
const refined = await signa.goodsServices.suggest({
  description: "men's running shoes for marathon training",
  class_number: 25,
});
// refined.classes has a single entry for class 25 with accepted terms.

Errors

StatusTypeDescription
400validation_errordescription missing, shorter than 3, longer than 500 chars, or class_number outside 1-45
401unauthorizedMissing or invalid API key
403forbiddenAPI key lacks trademarks:read scope
502upstream_errorClassification service temporarily unavailable