Skip to main content
Signa ingests trademark data from 2 production offices today (USPTO, WIPO) plus EUIPO in beta (sandbox verified), with 18 more planned. Each office provides data through different channels (APIs, bulk downloads, FTP feeds) with different update frequencies. This guide explains what to expect in terms of data freshness and how to check the current state of each source.

Per-Office Sync Schedule

Production Offices

OfficeCodePrimary SourceFrequencyTypical Lag
USPTOusptoODP API bulk daily XMLDaily< 24 hours
EUIPOeuipoeSearch Plus APIDaily< 24 hours
WIPOwipoFTP country notificationsWeekly per country1—7 days
USPTO publishes daily bulk files; Signa ingests within minutes of publication. End-to-end lag from a trademark event to API availability is typically < 24 hours.
EUIPO is currently in beta (sandbox verified). Production API access is pending (returns 403). Data shown is from the EUIPO sandbox environment.

Planned Offices

The following 18 offices are planned for future phases. Connector scaffolds and data source research are in progress. CIPO (Canada), DPMA (Germany), UKIPO (United Kingdom), IGE/IPI (Switzerland), INPI France, BOIP (Benelux), PRV (Sweden), NIPO (Norway), DKPTO (Denmark), PRH (Finland), ISIPO (Iceland), UPRP (Poland), IPOS (Singapore), JPO (Japan), KIPO (South Korea), CNIPA (China), DIP (Thailand), IP Vietnam.
Sync frequencies represent the target schedule for production offices. Actual freshness depends on office uptime and data availability. Use the source_data_date field to determine the actual age of any individual record.

Understanding source_data_date

Every trademark record carries a source_data_date field that indicates when the data was published by the source office — not when Signa ingested it. This distinction matters:
FieldMeaning
source_data_dateWhen the office published this version of the data
updated_atWhen Signa last wrote to this record
created_atWhen Signa first ingested this record
For example, a USPTO record with source_data_date: "2026-03-20" and updated_at: "2026-03-22T10:15:00Z" means the data was part of the March 20 daily file, which Signa processed on March 22.
# Check when a mark was last updated
curl -s https://api.signa.so/v1/trademarks/tm_abc123 \
  -H "Authorization: Bearer sig_live_xxx" | jq '{source_data_date, updated_at}'

Connector Architecture

Each office has a dedicated connector — a self-contained module that handles the specifics of fetching, parsing, and normalizing data from that office.
                    +-----------+
                    | Scheduler |
                    +-----+-----+
                          |
              +-----------+-----------+
              |           |           |
         +----v----+ +----v----+ +----v----+
         |  USPTO  | |  EUIPO  | |  WIPO   |  ...2 production + 1 beta
         |connector| |connector| |connector|
         +----+----+ +----+----+ +----+----+
              |           |           |
              v           v           v
         +----+----+ +----+----+ +----+----+
         | Normalize | Normalize | Normalize |
         +----+----+ +----+----+ +----+----+
              |           |           |
              +-----+-----+-----------+
                    |
              +-----v------+     +----------+
              |  Ingestion |---->|  Events   |
              |   Worker   |     |  Outbox   |
              +-----+------+     +----+-----+
                    |                  |
              +-----v------+     +----v-----+
              | PostgreSQL |     |   SNS    |
              +-----+------+     +----+-----+
                    |                  |
              +-----v------+     +----v-----+
              |   Search   |<----|   SQS    |
              |   Indexer  |     +----------+
              +-----+------+
                    |
              +-----v------+
              | OpenSearch |
              +------------+

Sync Modes

Each connector supports two sync modes:
ModeMethodUse Case
IncrementalfetchIncremental(since)Daily/weekly updates. Only fetches records changed since the last sync.
Full syncfetchFullSync()Initial load or periodic revalidation. Processes the entire dataset.
Incremental syncs use checkpointing, so they can resume from where they left off if interrupted. The checkpoint stores the exact position (file index, record offset) to avoid reprocessing.

Data Consistency Model

Signa uses a two-tier storage architecture with different consistency guarantees:

PostgreSQL (Source of Truth)

  • Consistency: Immediate
  • Writes: Synchronous, transactional
  • Reads: Strong consistency (read-your-writes)
  • All API detail endpoints (GET /v1/trademarks/{id}) read from PostgreSQL

OpenSearch (Search Index)

  • Consistency: Eventually consistent
  • Lag: Typically under 30 seconds after a database write
  • Writes: Asynchronous via event pipeline (outbox -> SNS -> SQS -> indexer)
  • Search endpoints (POST /v1/trademarks/search) read from OpenSearch
What this means in practice:
  1. When a trademark is updated, the detail endpoint reflects the change immediately
  2. The search endpoint may take up to 30 seconds to reflect the same change
  3. In rare cases (indexer backlog, reindexing), search lag can extend to minutes
# Detail endpoint (PostgreSQL) -- always current
curl -s https://api.signa.so/v1/trademarks/tm_abc123 \
  -H "Authorization: Bearer sig_live_xxx"

# Search endpoint (OpenSearch) -- eventually consistent
curl -s -X POST https://api.signa.so/v1/trademarks/search \
  -H "Authorization: Bearer sig_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"query": "SIGNA"}'

Checking Office Status

Use the reference data endpoints to check the current sync status of each office:
# List all offices with their sync status
curl -s https://api.signa.so/v1/reference/offices \
  -H "Authorization: Bearer sig_live_xxx"

# Get a specific office
curl -s https://api.signa.so/v1/reference/offices/uspto \
  -H "Authorization: Bearer sig_live_xxx"

Finding Recently Updated Records

Filter by updated_at to find records that changed within a time window:
# All marks updated in the last 24 hours
curl -s "https://api.signa.so/v1/trademarks?updated_at[gte]=2026-03-23T00:00:00Z&sort=-updated_at" \
  -H "Authorization: Bearer sig_live_xxx"
For real-time change notifications, use Watches & Webhooks instead of polling.

Known Limitations

Certain offices publish data with a built-in delay. For example, some offices only publish weekly gazette updates, meaning a status change on Monday may not appear in Signa’s data until the following week’s publication.
Full sync captures the current state of each record but may not include all historical events. Some offices only provide current snapshots without event history. Signa preserves all events it observes going forward, but events that occurred before the first ingestion may be missing.
Not all offices make mark images available via their data feeds. Some require separate image downloads. Image availability is indicated by the has_media field on trademark records.
Most offices provide goods/services descriptions in their local language. Signa stores the original text and language code but does not translate. Some offices (EUIPO, WIPO) provide multi-language descriptions.