Skip to main content
You build docketing software. Your customers are paralegals and attorneys who must answer every office action on time, file every renewal, and never miss a certificate. The hard part is not the deadline math, it is getting the underlying office documents reliably: office actions the day they issue, in a form you can attach to a matter, without each of your customers standing up their own TSDR poller and getting throttled. Signa fetches those documents for you on demand and streams the files through one URL. This guide wires the documents endpoint and the media proxy into a docketing loop.

Prerequisites

  • A Signa API key with trademarks:read scope
  • The trademark IDs (or office-native identifiers) for the marks you docket
  • Somewhere to store attachments (the guide streams PDFs straight to your matter store)

1

Lazy-fetch documents on first sight of a mark

When a mark enters your docket, ask for its documents. For a USPTO mark that Signa has never synced, this first request triggers an inline TSDR metadata fetch. You do not schedule anything, the read path does it.
The response is a normal list, plus a source_sync object telling you how fresh the metadata is.
2

Interpret source_sync before you trust the list

Branch on source_sync.status. It is the difference between “no documents” and “not fetched yet”.
  • synced: the list is current. Store it.
  • pending: a fetch is in flight (another request holds the lock) or upstream is still settling. data may be empty or partial. Do not record “no documents”, request again shortly.
  • unsupported: the mark’s office has no document support today (everything except USPTO). Skip it, no amount of polling changes this.
3

Poll to freshness with backoff

When you get pending, request again. A short bounded retry with backoff is enough, the fetch is a single upstream round-trip, not a long job.
Signa collapses concurrent first-requests for the same mark into a single upstream fetch, so you do not need your own lock. If your worker fleet asks for the same never-synced mark at once, exactly one TSDR fetch happens and the rest see pending, then synced.
4

Filter to the documents that drive deadlines

Docketing cares about specific kinds. Filter server-side by document_kind and by official date so you only pull what changes a deadline.
cURL
Each row carries a url. That is your handle to the file.
5

Stream the office-action PDF into the matter

Follow the row’s url to stream the file. It points at the media proxy, which serves the bytes with their real content type (application/pdf for office actions and certificates) and X-Content-Type-Options: nosniff.
Two rules for the proxy:
  • It is unauthenticated but IP rate-limited. Use it as a per-download link, not a bulk drain. Fetch a document when you need to attach it, not on a sweep.
  • The first download of a USPTO file is a cold fetch. The proxy pulls from TSDR under a shared budget and persists the file. When the budget is momentarily spent, you get 502 upstream_error with Retry-After (seconds). Honor it. Once persisted, later downloads serve stored bytes and never touch TSDR.
cURL
6

Stay fresh with forward-only refresh

Documents are forward-only. New filings and office actions appear over time, existing rows do not mutate or disappear. That makes the refresh loop cheap: on each docket run, request documents for your active marks filtered by official_date_gte set to your last run, and you only see what is new.
Because the row id and url are stable, you can dedupe by med_ id: a document you already attached keeps the same id across runs, so re-seeing it is a no-op. Pair this with a document watch (see Monitoring) if you want to be pushed when a new office action lands instead of polling.

Putting it together

A single docket cycle for one mark:

What you built

  • Documents pulled on demand, no TSDR poller of your own to run or throttle around.
  • A three-state read (synced, pending, unsupported) that never mistakes “not fetched yet” for “no documents”.
  • Office-action PDFs streamed straight into matters through one stable, dedupe-friendly URL.
  • A cheap forward-only refresh keyed on official date and med_ id.