Skip to main content
You cover a basket of listed companies and you want their trademarks keyed the way you already think about them: by ticker. Give Signa a ticker like NKE and it resolves to the underlying entity, hands you the company’s worldwide portfolio (subsidiaries included), and lets you subscribe to every future filing. This works because Signa links public-company facts onto entities: SEC tickers on the members that matched, plus a listing decoration that flows a listed parent’s ticker down to its subsidiaries through the GLEIF corporate family. So a ticker is not just the parent’s own marks, it is the whole listed group.

Prerequisites

  • A Signa API key with trademarks:read scope
  • A stock ticker (uppercased, for example NKE or AAPL)

1

Resolve the ticker to an entity

Filter GET /v1/entities by ticker. The match is subsidiary-inclusive, so ticker=NKE returns Nike and its subsidiary entities. Sort by -trademark_count to put the parent first.
curl -G "https://api.signa.so/v1/entities" \
  -H "Authorization: Bearer $SIGNA_API_KEY" \
  --data-urlencode "ticker=NKE" \
  --data-urlencode "sort=-trademark_count" \
  --data-urlencode "limit=20"
import { Signa } from "@signa-so/sdk";

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

const entities = await signa.entities.list({
  ticker: "NKE",
  sort: "-trademark_count",
  limit: 20,
});

for await (const entity of entities) {
  console.log(entity.id, entity.name, entity.ticker, entity.trademark_count);
}
The first row is the listed parent. Keep its id (an ent_*) for the next step.
2

Read the listing block

Fetch the entity with GET /v1/entities/{id}. When an entity is listed or a subsidiary of a listed company, the response carries a listing block. The block is omitted entirely when there is no listing, so its absence means “no listing or unknown,” never confirmed-private.
Listing block
{
  "id": "ent_R3jK9mN2",
  "name": "Converse Inc.",
  "ticker": "NKE",
  "tickers": ["NKE"],
  "listing": {
    "status": "subsidiary_of_listed",
    "ticker": "NKE",
    "exch_code": "XNYS",
    "lei": "INR2EJN1ERAN0W5ZP974",
    "source": "inherited",
    "listed_ancestor": {
      "id": "ent_9Km2nPq4",
      "name": "Nike, Inc.",
      "ticker": "NKE"
    }
  }
}
Read it as two axes:
  • status: listed (the entity is itself publicly listed) or subsidiary_of_listed (it inherits a ticker from a listed ancestor).
  • source: direct (the ticker is the entity’s own) or inherited (the ticker comes from the nearest listed ancestor, surfaced in listed_ancestor). source is just status restated: listed is always direct, subsidiary_of_listed is always inherited.
A directly-listed parent (status: "listed", source: "direct") has listed_ancestor: null. For a subsidiary, listed_ancestor points at the listed parent when it resolves to a live entity in our system (it is null when the ancestor exists only in the GLEIF graph).
3

Pull the worldwide portfolio, subsidiaries included

Call GET /v1/entities/{id}/trademarks on the listed parent with include_family=true. That expands the query to the entity and every descendant in its GLEIF family tree, so one call returns the whole listed group’s marks across all 21 offices. Drop include_family (or set it false) to get just that one entity.
curl -G "https://api.signa.so/v1/entities/ent_9Km2nPq4/trademarks" \
  -H "Authorization: Bearer $SIGNA_API_KEY" \
  --data-urlencode "include_family=true" \
  --data-urlencode "status_primary=active" \
  --data-urlencode "sort=-filing_date" \
  --data-urlencode "limit=20"
const page = await signa.entities.trademarks("ent_9Km2nPq4", {
  include_family: true,
  status_primary: "active",
  sort: "-filing_date",
  limit: 20,
});
The full List Trademarks filter set applies here (status, Nice classes, jurisdiction, date ranges), so you can narrow the group’s portfolio to, say, active class 25 marks filed this year. A family graph larger than the walk bounds returns 422 with error.reason family_graph_too_large.
4

Stand up a public-company watch

To be notified of future filings under the ticker, add ownerTicker to a watch’s filters. Watch filters share the same public-company/listing fields as search, so ownerTicker is subsidiary-inclusive too: ownerTicker: "NKE" fires on Nike’s own filings and its subsidiaries’ filings alike.Every watch needs a base scope from its watch_type (see Monitoring watches); ownerTicker is an additional filter layered on top. A common preset scopes a class watch to the Nice classes you care about and narrows it to the ticker, so you only hear about the group’s filings in your core classes:
cURL
curl -X POST "https://api.signa.so/v1/watches" \
  -H "Authorization: Bearer $SIGNA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: watch-nke-class25-001" \
  -d '{
    "name": "Nike group, class 25 filings",
    "watch_type": "class",
    "query": {
      "version": "v2",
      "filters": { "niceClasses": [25], "ownerTicker": "NKE" },
      "trigger_events": ["trademark.created"]
    }
  }'
Prefer a broader net? Swap ownerTicker for "ownerPubliclyTraded": true to watch new filings by any owner with an active listing association (a confirmed SEC ticker, or a resolved entity that is listed or a subsidiary of one), still scoped by your chosen classes. Preview the volume with POST /v1/watches/preview before you commit, and wire delivery through a webhook.

Coverage caveats

Public-company linkage is confirmed-positive only, and this shapes how you read a result:
  • Absent is not private. A missing ticker, publicly_traded: false, or an omitted listing block means no confirmed match was found, not that the company is confirmed private or unlisted. Never infer “private” from absence.
  • Coverage is strongest for large caps. Linkage leans on SEC tickers and GLEIF LEI reporting, so widely-held, LEI-reporting issuers resolve best. Thinly-covered small caps and non-reporting subsidiaries are likelier to be missing an edge.
  • Subsidiary reach depends on GLEIF Level 2. The inherited-ticker walk follows the GLEIF corporate family, which covers LEI-reporting companies only. An absent parent/subsidiary edge does not imply the absence of a corporate relationship.
Coverage is measured with the ENG-118 eval harness; the production number is pending rollout and will be cited here once it lands.