> ## Documentation Index
> Fetch the complete documentation index at: https://docs.signa.so/llms.txt
> Use this file to discover all available pages before exploring further.

# Suggest Goods & Services

> Draft a goods/services specification from a description, with filing-ready wording per class

## 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; invented wording never appears.

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

<Info>
  Just need the class numbers (no wording)? Use [Suggest Classifications](/api-reference/reference/suggest-classifications) instead: same input, lighter response, billed at 1 unit.
</Info>

Pass `class_number` in the body to restrict the response to a single, already-chosen class. This is 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](/guides/classifications).

## Body Parameters

<ParamField body="description" type="string" required>
  Description of the goods, services, or business (3-500 characters). Natural-language, no special format.
</ParamField>

<ParamField body="jurisdiction_code" type="string">
  Optional ISO-3166-1 alpha-2 jurisdiction code (e.g. `US`, `EU`, `GB`). Biases retail-vs-product interpretation toward local practice.
</ParamField>

<ParamField body="class_number" type="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.
</ParamField>

## Response

<ResponseField name="object" type="string">Always `goods_services_suggestion`.</ResponseField>
<ResponseField name="query" type="string">The description you submitted, echoed back.</ResponseField>
<ResponseField name="classifier_version" type="string">Version tag of the classifier that produced this response.</ResponseField>
<ResponseField name="classes" type="object[]">Ranked suggested classes, each with filing-ready accepted terms.</ResponseField>
<ResponseField name="classes[].class_number" type="integer">Nice class number (1-45).</ResponseField>
<ResponseField name="classes[].title" type="string">Canonical class title.</ResponseField>
<ResponseField name="classes[].confidence" type="string">One of `high`, `medium`, or `low`.</ResponseField>
<ResponseField name="classes[].rank" type="integer">1-indexed position in the returned ordering.</ResponseField>
<ResponseField name="classes[].recommendation_type" type="string">One of `core`, `conditional`, or `adjacent`.</ResponseField>
<ResponseField name="classes[].conditional_on" type="string | null">When `recommendation_type` is `conditional`, the condition under which this class applies. Otherwise `null`.</ResponseField>
<ResponseField name="classes[].rationale" type="string">Short explanation of why this class was suggested.</ResponseField>
<ResponseField name="classes[].accepted_terms" type="object[]">Paste-ready goods/services terms for this class, drawn only from the pre-approved catalog.</ResponseField>
<ResponseField name="ambiguous" type="boolean">`true` when the description has two or more materially different filing strategies.</ResponseField>
<ResponseField name="clarification_question" type="string | null">When `ambiguous` is `true`, a question to ask the user. Otherwise `null`.</ResponseField>
<ResponseField name="request_id" type="string">Unique request identifier for support and debugging.</ResponseField>

Each item in `accepted_terms` has this shape:

| Field              | Type      | Description                                            |
| ------------------ | --------- | ------------------------------------------------------ |
| `term`             | string    | The canonical term text.                               |
| `source`           | string    | Source catalog (e.g. `tmclass`, `uspto_idm`).          |
| `accepted_offices` | string\[] | Offices that accept this term (e.g. `USPTO`, `EUIPO`). |
| `harmonised`       | boolean   | Whether the term is on the TMClass harmonised list.    |

<ResponseExample>
  ```json theme={null}
  {
    "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": "Running shoes",
            "source": "tmclass",
            "accepted_offices": ["EUIPO"],
            "harmonised": true
          },
          {
            "term": "Athletic footwear",
            "source": "uspto_idm",
            "accepted_offices": ["USPTO"],
            "harmonised": false
          }
        ]
      },
      {
        "class_number": 35,
        "title": "Advertising",
        "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_dV4mN8pQ"
  }
  ```
</ResponseExample>

## Billing

Billed as **2 credits** (`check` endpoint type).

## Code Examples

### Full draft (let the classifier pick the classes)

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://api.signa.so/v1/goods-services/suggest" \
    -H "Authorization: Bearer sig_YOUR_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "description": "e-commerce company selling sneakers",
      "jurisdiction_code": "US"
    }'
  ```

  ```typescript TypeScript theme={null}
  import { Signa } from "@signa-so/sdk";

  const signa = new Signa({ api_key: process.env.SIGNA_API_KEY });

  const spec = await signa.goodsServices.suggest({
    description: "e-commerce company selling sneakers",
    jurisdiction_code: "US",
  });

  for (const cls of spec.classes) {
    console.log(`Class ${cls.class_number}: ${cls.title}`);
    for (const term of cls.accepted_terms) {
      console.log(`  ${term.term}`);
    }
  }
  ```
</CodeGroup>

### 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 TypeScript theme={null}
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

| Status | Type               | Description                                                                                  |
| ------ | ------------------ | -------------------------------------------------------------------------------------------- |
| 400    | `validation_error` | `description` missing, shorter than 3, longer than 500 chars, or `class_number` outside 1-45 |
| 401    | `unauthorized`     | Missing or invalid API key                                                                   |
| 403    | `forbidden`        | API key lacks `trademarks:read` scope                                                        |
| 502    | `upstream_error`   | Classification service temporarily unavailable                                               |

## Related Endpoints

* [Suggest Classifications](/api-reference/reference/suggest-classifications), same input, lighter response, billed at 1 unit
* [List Goods & Services](/api-reference/reference/list-goods-services), browse and search the pre-approved terms catalog directly
* [List Classifications](/api-reference/reference/list-classifications)
* [Get Classification](/api-reference/reference/get-classification)
