Skip to main content
The Signa API organizes trademark data around four core entity types. Each has its own namespace on the SDK client with retrieve(), list(), and relationship methods.

Trademarks

Retrieve

Fetch a single trademark by its Signa ID. Returns the full detail tier including owners, classifications, attorneys, media, and Madrid coverage.
const tm = await signa.trademarks.retrieve('tm_abc123');

console.log(tm.mark_text);          // "SIGNA"
console.log(tm.status.primary);     // "active"
console.log(tm.owners);             // [{ id: 'own_...', name: 'Signa Inc.' }]
console.log(tm.classifications);    // [{ nice_class: 9, ... }]
Optionally embed prosecution history:
const tm = await signa.trademarks.retrieve('tm_abc123', {
  include: ['history'],
});

// The 50 most recent events are inlined
for (const event of tm.history) {
  console.log(event.event_date, event.event_type, event.description);
}

History

Full prosecution event history for a trademark, paginated:
const events = await signa.trademarks.history('tm_abc123');

for await (const event of events) {
  console.log(event.event_date, event.event_type);
}

Changes

Version-level change tracking — what fields changed between ingestion versions:
const changes = await signa.trademarks.changes('tm_abc123');

for await (const change of changes) {
  console.log(change.changed_at, change.fields_changed);
}
Find trademarks related to a given mark (same owner, similar name, Madrid family):
const related = await signa.trademarks.related('tm_abc123');

for await (const rel of related) {
  console.log(rel.trademark.mark_text, rel.relationship_type);
}

Proceedings

Oppositions, cancellations, and other proceedings linked to a trademark:
const procs = await signa.trademarks.proceedings('tm_abc123');

for await (const proc of procs) {
  console.log(proc.proceeding_type, proc.status);
}

Madrid Coverage

For Madrid Protocol registrations — list the designated territories:
const coverage = await signa.trademarks.coverage('tm_abc123');

for await (const territory of coverage) {
  console.log(territory.jurisdiction_code, territory.status);
}

Media

Get a signed URL for a trademark’s image or other media asset:
const imageUrl = await signa.trademarks.media('tm_abc123', 'med_def456');
// Returns a redirect URL to the media file

Source

Provenance metadata — where the data came from and when it was last synced:
const source = await signa.trademarks.source('tm_abc123');

console.log(source.office_code);    // "uspto"
console.log(source.source_type);    // "bulk_daily"
console.log(source.last_synced_at); // "2025-04-14T..."

Suggest

Autocomplete suggestions as the user types:
const suggestions = await signa.trademarks.suggest({ q: 'appl' });

for (const s of suggestions.data) {
  console.log(s.mark_text, s.office_code);
}

Owners

Retrieve

Fetch an owner with aliases, identifiers, address, and stats:
const owner = await signa.owners.retrieve('own_abc123');

console.log(owner.name);           // "Apple Inc."
console.log(owner.country_code);   // "US"
console.log(owner.stats);          // { trademark_count: 1234, ... }

List

Search and filter owners:
const owners = await signa.owners.list({ q: 'Apple', country_code: 'US' });

for await (const owner of owners) {
  console.log(owner.name, owner.trademark_count);
}

Owner’s Trademarks

List all trademarks owned by a specific entity:
const marks = await signa.owners.trademarks('own_abc123', {
  status: 'registered',
});

for await (const tm of marks) {
  console.log(tm.mark_text, tm.filing_date);
}

Corporate Relationships

Corporate parent/child relationships derived from GLEIF data:
const related = await signa.owners.related('own_abc123');

for await (const rel of related) {
  console.log(rel.related_owner.name, rel.relationship_type);
  // "Alphabet Inc.", "parent"
}

Attorneys

Retrieve

Fetch an attorney with firm linkage, stats, and top clients:
const attorney = await signa.attorneys.retrieve('att_abc123');

console.log(attorney.name);
console.log(attorney.firm);            // { id: 'fm_...', name: '...' }
console.log(attorney.stats);           // { trademark_count, ... }

List

Search attorneys by name or firm:
const attorneys = await signa.attorneys.list({ q: 'Smith' });

for await (const att of attorneys) {
  console.log(att.name, att.firm?.name);
}

Attorney’s Trademarks

const marks = await signa.attorneys.trademarks('att_abc123');

for await (const tm of marks) {
  console.log(tm.mark_text);
}

Attorney’s Clients

List the owners (clients) represented by this attorney:
const clients = await signa.attorneys.clients('att_abc123');

for await (const client of clients) {
  console.log(client.owner.name, client.trademark_count);
}

Firms

Retrieve

const firm = await signa.firms.retrieve('fm_abc123');

console.log(firm.name);
console.log(firm.attorney_count);
console.log(firm.stats);

List

const firms = await signa.firms.list({ q: 'Morrison' });

for await (const firm of firms) {
  console.log(firm.name, firm.attorney_count);
}

Firm’s Attorneys

const attorneys = await signa.firms.attorneys('fm_abc123', {
  sort: '-trademark_count',
});

for await (const att of attorneys) {
  console.log(att.name, att.trademark_count);
}

Firm’s Trademarks

const marks = await signa.firms.trademarks('fm_abc123');

for await (const tm of marks) {
  console.log(tm.mark_text, tm.office_code);
}

Proceedings

Standalone access to opposition, cancellation, and other tribunal proceedings:

Retrieve

const proc = await signa.proceedings.retrieve('prc_abc123');

console.log(proc.proceeding_type); // "opposition"
console.log(proc.status);          // "pending"
console.log(proc.parties);

List

// Proceedings for a specific trademark
const procs = await signa.proceedings.list({ trademark_id: 'tm_abc123' });

// Filter by type and status
const oppositions = await signa.proceedings.list({
  proceeding_type: 'opposition',
  status: 'pending',
});

Cross-Entity Suggest

Search across all entity types in a single call — useful for building omnisearch UIs:
const suggestions = await signa.suggest.crossEntity({ q: 'apple' });

for (const s of suggestions.data) {
  console.log(s.type, s.text); // "trademark", "APPLE" / "owner", "Apple Inc."
}

// Limit to a specific type
const ownerSuggestions = await signa.suggest.crossEntity({
  q: 'apple',
  type: 'owner',
});