Skip to main content
Understanding where trademark data comes from and how often it’s updated.

Official Data Sources

We pull trademark data directly from official government trademark offices:
OfficeSourceStatusUpdate FrequencyCoverage
USPTOUSPTO TSDR✅ LiveDailyUnited States
EUIPOEUIPO eSearch✅ LiveDaily27 EU countries
UKIPOUK IPO✅ LiveDailyUnited Kingdom
WIPOWIPO Global Brand Database✅ LiveDaily130+ countries (Madrid Protocol)

Data Normalization

The Problem We Solve

Each trademark office has different:
  • Data formats (XML, JSON, CSV, PDF)
  • Field names and structures
  • Status codes and taxonomies
  • Classification systems
  • Date formats and timezones
We normalize everything into a unified API response.

Unified Data Model

All trademarks, regardless of office, use our consistent schema:
{
  "id": "tm_us_1234567",
  "canonical_id": "tm_canonical_apple_001",
  "office": {
    "code": "USPTO",
    "name": "United States Patent and Trademark Office"
  },
  "mark": {
    "text": "APPLE",
    "type": "word"
  },
  "status": {
    "unified_status": "live_registered",
    "unified_status_code": "LR",
    "office_status": "Registered"
  }
}

Unified Status Codes

We map all office-specific statuses to 6 unified codes:
CodeUnified StatusDescriptionOffice Examples
LPlive_pendingApplication under examinationUSPTO: “New Application”, EUIPO: “Application published”
LRlive_registeredActive registered trademarkUSPTO: “Registered”, EUIPO: “Registered”
LOlive_oppositionUnder opposition proceedingsUSPTO: “Opposition pending”, EUIPO: “Opposition”
DAdead_abandonedApplication abandonedUSPTO: “Abandoned”, EUIPO: “Withdrawn”
DCdead_cancelledRegistration cancelledUSPTO: “Cancelled”, EUIPO: “Revoked”
DEdead_expiredRegistration expiredUSPTO: “Expired”, EUIPO: “Expired”
We preserve the original office status in office_status for reference.

Data Freshness

Sync Schedule

  • USPTO: Daily sync at 02:00 UTC
  • EUIPO: Daily sync at 03:00 UTC
  • UKIPO: Daily sync at 04:00 UTC
  • WIPO: Daily sync at 05:00 UTC
Average sync completion time: 2-4 hours per office.

Sync Process

  1. Download - Fetch latest data from official sources
  2. Parse - Extract and validate fields
  3. Normalize - Map to unified Trademark schema
  4. Enrich - Add canonical IDs, cross-office links
  5. Index - Optimize for fast searching
  6. Quality Check - Validate data integrity

Last Verified Timestamp

Every trademark includes data quality metadata:
{
  "metadata": {
    "data_quality_score": 95,
    "data_completeness": 98,
    "last_verified": "2025-10-15T08:30:00Z",
    "normalization_version": "2.1"
  }
}
Fields explained:
  • data_quality_score - Overall data quality (0-100)
  • data_completeness - Percentage of fields populated
  • last_verified - When this record was last synced
  • normalization_version - Schema version used

Cross-Office Tracking

Canonical IDs

Trademarks filed in multiple offices get a canonical_id:
{
  "id": "tm_us_1234567",
  "canonical_id": "tm_canonical_apple_001",
  "related_registrations": {
    "count": 12,
    "same_mark_other_offices": [
      {
        "id": "tm_euipo_9876543",
        "office": "EUIPO",
        "registration_number": "123456",
        "status": "live_registered"
      },
      {
        "id": "tm_wipo_5555555",
        "office": "WIPO",
        "status": "live_registered"
      }
    ]
  }
}
This lets you track trademark families across jurisdictions.

Source Attribution

Every record includes a direct link to the official source:
{
  "urls": {
    "api": "https://api.signa.so/v1/trademarks/tm_us_1234567",
    "web": "https://signa.so/marks/tm_us_1234567",
    "office_url": "https://tsdr.uspto.gov/#caseNumber=73222079"
  }
}
Always verify critical decisions with the office_url.

Data Quality

Quality Score Calculation

We calculate quality scores based on:
  • Completeness (40%) - Are all fields populated?
  • Consistency (30%) - Do fields match expected patterns?
  • Freshness (20%) - How recently was it verified?
  • Source Reliability (10%) - Official vs derived data
Scores above 90 are considered high quality.

Known Limitations

Data may be up to 24 hours behind the official source. New filings can take 24-48 hours to appear.Recommendation: For time-sensitive decisions, verify with the office_url.
We can only normalize what offices provide. Some offices have:
  • Missing fields
  • Inconsistent formats
  • Translation issues
  • Typos in original data
We flag low-quality data with lower data_quality_score.
Statuses can change rapidly (e.g., PENDING → REGISTERED in hours). Our daily sync may miss rapid changes.Recommendation: Monitor critical marks with webhooks.
We maintain current status only. Historical status changes (e.g., when a mark transitioned from pending to registered) are not yet available.Coming Soon: Status history timeline.
Image quality varies by office:
  • USPTO: High quality PNGs
  • EUIPO: Medium quality JPEGs
  • WIPO: Variable quality
  • UKIPO: Some missing
We provide best available quality.

Checking Data Freshness

Monitor data age in your application:
function isDataFresh(trademark, maxAgeHours = 24) {
  const lastVerified = new Date(trademark.metadata.last_verified);
  const ageHours = (Date.now() - lastVerified.getTime()) / (1000 * 60 * 60);

  return ageHours <= maxAgeHours;
}

const trademark = await getTrademark('tm_us_1234567');

if (!isDataFresh(trademark, 24)) {
  console.warn(`Data is ${getAgeHours(trademark)} hours old`);
  console.log(`Verify at: ${trademark.urls.office_url}`);
}

Data Coverage

Trademark Counts

OfficeTotal TrademarksLive RegistrationsAnnual Filings
USPTO3.5M+2.8M+~600K/year
EUIPO2M+1.6M+~180K/year
UKIPO500K+400K+~90K/year
WIPO1.5M+1.2M+~75K/year
Total coverage: 147M+ trademark records across 200+ offices worldwide.

Geographic Coverage

  • US: Complete USPTO database
  • EU: All 27 member states via EUIPO
  • UK: Complete UKIPO database post-Brexit
  • International: 130+ countries via WIPO Madrid Protocol

Best Practices

Trademark data doesn’t change frequently. Cache search results for several hours:
const CACHE_TTL = 6 * 60 * 60 * 1000; // 6 hours

async function searchWithCache(query) {
  const cached = cache.get(query);
  if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
    return cached.data;
  }

  const data = await search(query);
  cache.set(query, { data, timestamp: Date.now() });
  return data;
}
Show users when data was last updated:
function formatLastVerified(timestamp) {
  const date = new Date(timestamp);
  return `Last updated ${formatDistanceToNow(date)} ago`;
}

// Display: "Last updated 3 hours ago"
For important brand protection, set up monitoring rather than polling:
// Bad: Polling wastes credits
setInterval(() => checkTrademark(id), 3600000);

// Good: Webhook notification
await createMonitor({
  watches: [{ type: 'trademark_id', value: id }],
  webhook_events: ['status_change']
});
Important Legal NoticeThe Signa API provides informational data only and does not constitute legal advice.
  • Data is sourced from official trademark offices but may contain errors
  • Status information should be verified with official sources
  • Trademark law is complex and varies by jurisdiction
  • Filing dates, ownership, and legal status should be confirmed independently
Always consult with a qualified trademark attorney before making legal or business decisions based on this data.

Enterprise Data Features

Enterprise customers can access:
  • Custom sync schedules - Real-time, hourly, or on-demand
  • Priority indexing - New filings indexed within minutes
  • Historical snapshots - Access previous versions of records
  • Status change history - Track full trademark lifecycle
  • Raw office data - Access original source data
  • Dedicated infrastructure - Isolated data pipeline
  • Custom data exports - Bulk downloads in your format
  • SLA guarantees - Guaranteed data freshness and uptime
Contact Sales →

Status Monitoring

Check which offices are currently syncing:
curl https://api.signa.so/v1/health
{
  "status": "healthy",
  "version": "1.0.0",
  "offices": {
    "USPTO": {
      "status": "operational",
      "last_sync": "2025-10-15T06:30:00Z",
      "next_sync": "2025-10-16T02:00:00Z",
      "records": 3542891
    },
    "EUIPO": {
      "status": "syncing",
      "last_sync": "2025-10-15T03:00:00Z",
      "progress": "45%"
    }
  }
}

Next Steps