Skip to main content

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.

You have just closed the acquisition of Helios Consumer Brands Inc. (see M&A Due Diligence). Now you need to execute the ownership transfer — recording the assignment of 312 trademarks across 14 jurisdictions from the old owner to your corporate entity. This is a multi-month project with office-specific requirements and strict sequencing. This guide shows how to use the Signa API to plan, track, and verify the transfer.

Prerequisites

  • A Signa API key with trademarks:read scope
  • Completed due diligence with a known list of marks to transfer
  • The acquiring entity’s owner ID in Signa

1

Collect every acquired mark ID

Paginate through each seller owner (and any subsidiary owners that came with the deal) to build the master list of marks you need to transfer. Persist this list — you’ll reuse it for every downstream step.
import Signa from "@signa-so/sdk";

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

const sellerOwnerIds = ["own_helios01", "own_hel_eu01", "own_hel_asia01"];
const allMarkIds: string[] = [];

for (const ownerId of sellerOwnerIds) {
  let cursor: string | null = null;
  do {
    const page = await signa.owners.trademarks(ownerId, { limit: 100, cursor });
    allMarkIds.push(...page.data.map((tm) => tm.id));
    cursor = page.has_more ? page.pagination.cursor : null;
  } while (cursor);
}

console.log(`Total marks to transfer: ${allMarkIds.length}`);
Store allMarkIds, the deal reference, and key dates (closing, target completion) in your own deal tracker or spreadsheet. Every step below reads from this list.
2

Assess transfer readiness for each mark

Not every mark can be transferred immediately. Check for blocking conditions: pending proceedings, marks in opposition, grace period deadlines, and marks held by subsidiaries that may need separate assignment documents.
interface TransferAssessment {
  trademarkId: string;
  markText: string;
  office: string;
  jurisdiction: string;
  status: string;
  currentOwner: string;
  blockers: string[];
  urgentDeadlines: any[];
  readiness: "ready" | "blocked" | "needs_attention";
}

const assessments: TransferAssessment[] = [];

// Fetch full details for all marks
for (let i = 0; i < allMarkIds.length; i += 100) {
  const batch = allMarkIds.slice(i, i + 100);
  const details = await signa.trademarks.batch({ ids: batch });

  for (const tm of details.data) {
    const blockers: string[] = [];

    // Check status blockers
    if (["abandoned", "cancelled", "expired", "refused"].includes(tm.status.stage)) {
      blockers.push(`Status is ${tm.status.stage} - cannot transfer`);
    }

    // Check for pending proceedings
    if (tm.proceedings_count > 0) {
      const procs = await signa.trademarks.proceedings(tm.id, { limit: 5 });
      const pending = procs.data.filter((p) => p.status === "pending");
      if (pending.length > 0) {
        blockers.push(`${pending.length} pending proceeding(s)`);
      }
    }

    // Check for imminent deadlines
    const urgentDeadlines = tm.deadlines.filter((d) => {
      const daysUntil = Math.ceil(
        (new Date(d.due_date).getTime() - Date.now()) / (1000 * 60 * 60 * 24),
      );
      return daysUntil <= 90 && daysUntil > 0;
    });

    if (urgentDeadlines.length > 0) {
      blockers.push(`${urgentDeadlines.length} deadline(s) within 90 days`);
    }

    assessments.push({
      trademarkId: tm.id,
      markText: tm.mark_text,
      office: tm.office_code,
      jurisdiction: tm.jurisdiction_code,
      status: tm.status.stage,
      currentOwner: tm.owners[0]?.name || "unknown",
      blockers,
      urgentDeadlines,
      readiness:
        blockers.length === 0
          ? "ready"
          : blockers.some((b) => b.includes("cannot transfer"))
            ? "blocked"
            : "needs_attention",
    });
  }
}

// Summary
const ready = assessments.filter((a) => a.readiness === "ready");
const blocked = assessments.filter((a) => a.readiness === "blocked");
const needsAttention = assessments.filter((a) => a.readiness === "needs_attention");

console.log("\n=== Transfer Readiness ===");
console.log(`Ready to transfer: ${ready.length}`);
console.log(`Needs attention: ${needsAttention.length}`);
console.log(`Blocked: ${blocked.length}`);

if (needsAttention.length > 0) {
  console.log("\n--- Marks needing attention ---");
  for (const a of needsAttention) {
    console.log(`  ${a.markText} (${a.office} / ${a.jurisdiction})`);
    for (const b of a.blockers) {
      console.log(`    - ${b}`);
    }
  }
}
Expected output:
=== Transfer Readiness ===
Ready to transfer: 278
Needs attention: 19
Blocked: 15

--- Marks needing attention ---
  HELIOS GLOW (euipo / EU)
    - 1 pending proceeding(s)
    - 1 deadline(s) within 90 days
  HELIOS PURE (uspto / US)
    - 1 deadline(s) within 90 days
3

Plan the recording sequence by jurisdiction

Each office has different requirements and timelines for recording assignments. Group marks by office and plan the sequence.
// Group ready marks by office
const byOffice: Record<string, TransferAssessment[]> = {};
for (const a of assessments.filter((a) => a.readiness === "ready")) {
  if (!byOffice[a.office]) byOffice[a.office] = [];
  byOffice[a.office].push(a);
}

console.log("\n=== Recording Plan ===");
for (const [office, marks] of Object.entries(byOffice).sort((a, b) => b[1].length - a[1].length)) {
  console.log(`\n${office.toUpperCase()} (${marks.length} marks)`);

  // Count unique current owners (some may be subsidiaries)
  const owners = [...new Set(marks.map((m) => m.currentOwner))];
  console.log(`  Current owners: ${owners.join(", ")}`);
  console.log(`  Assignment documents needed: ${owners.length}`);
}
Office-specific transfer requirements:
OfficeRecording MethodTypical TimelineNotes
USPTOFile assignment via ETAS (electronic)2-4 weeksOne document can cover multiple marks
EUIPORecord transfer via eService4-8 weeksEach mark needs separate request
WIPO (Madrid)File MM5 form via Madrid eRenewal6-12 weeksRecorded at IB, then notified to each designated office
CIPOFile via CIPO Online4-6 weeks
UKIPOFile TM16 form2-4 weeks
DPMAFile via DPMAregister4-8 weeksGerman language required
4

Monitor transfer progress

Re-run a batch fetch over allMarkIds weekly and count how many marks now carry the acquiring entity as their recorded owner. Every GET /v1/trademarks/{id} response includes the current owners, so no change-stream is required — the batch endpoint comfortably handles 100 IDs per call.
const buyerOwnerId = "own_apex01";
let transfersRecorded = 0;

for (let i = 0; i < allMarkIds.length; i += 100) {
  const page = await signa.trademarks.batch({ ids: allMarkIds.slice(i, i + 100) });
  for (const entry of page.data) {
    if (entry.status !== "success") continue;
    if (entry.data.owners.some((o: any) => o.id === buyerOwnerId)) {
      transfersRecorded++;
    }
  }
}

const totalToTransfer = allMarkIds.length;
const readyCount = ready.length;

console.log("\n=== Transfer Progress ===");
console.log(`Total marks: ${totalToTransfer}`);
console.log(`Ready to transfer: ${readyCount}`);
console.log(`Transfers detected: ${transfersRecorded}`);
console.log(`Progress: ${((transfersRecorded / readyCount) * 100).toFixed(0)}%`);
Run this progress check weekly and share the results with the deal team. Pair it with the Trademark Changes endpoint on individual marks to pinpoint exactly when an office recorded the assignment.
5

Verify completed transfers

Once a transfer is recorded, verify that the mark’s owner record has been updated correctly by pulling the trademark detail.
curl https://api.signa.so/v1/trademarks/tm_hel001 \
  -H "Authorization: Bearer $SIGNA_API_KEY"
You can also review the change history to see exactly when the ownership changed:
curl "https://api.signa.so/v1/trademarks/tm_hel001/changes?limit=5&sort=-created_at" \
  -H "Authorization: Bearer $SIGNA_API_KEY"

Transfer timeline tracker

Build a summary view for your deal team:
PhaseStatusCountTarget Date
Due diligence completeDone312 marks inventoried2026-03-01
Assignment documents executedDone4 documents (3 entities)2026-03-15
USPTO recordings filedIn progress124 marks2026-04-30
EUIPO recordings filedIn progress68 marks2026-05-31
WIPO/Madrid recordings filedPending42 marks2026-06-30
Other offices filedPending44 marks2026-07-31
All recordings confirmedPending278 marks (excl. blocked)2026-09-30

What’s next

Renewal Management

Ensure no deadlines are missed during the transfer process.

Class Coverage Audits

Audit the combined portfolio for coverage gaps after the acquisition.