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
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.
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
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:| Office | Recording Method | Typical Timeline | Notes |
|---|
| USPTO | File assignment via ETAS (electronic) | 2-4 weeks | One document can cover multiple marks |
| EUIPO | Record transfer via eService | 4-8 weeks | Each mark needs separate request |
| WIPO (Madrid) | File MM5 form via Madrid eRenewal | 6-12 weeks | Recorded at IB, then notified to each designated office |
| CIPO | File via CIPO Online | 4-6 weeks | |
| UKIPO | File TM16 form | 2-4 weeks | |
| DPMA | File via DPMAregister | 4-8 weeks | German language required |
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. 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:
| Phase | Status | Count | Target Date |
|---|
| Due diligence complete | Done | 312 marks inventoried | 2026-03-01 |
| Assignment documents executed | Done | 4 documents (3 entities) | 2026-03-15 |
| USPTO recordings filed | In progress | 124 marks | 2026-04-30 |
| EUIPO recordings filed | In progress | 68 marks | 2026-05-31 |
| WIPO/Madrid recordings filed | Pending | 42 marks | 2026-06-30 |
| Other offices filed | Pending | 44 marks | 2026-07-31 |
| All recordings confirmed | Pending | 278 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.