Prerequisites
- A Signa API key with
trademarks:readscope - 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.datamay 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 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, request again. A short bounded retry with backoff is enough, the fetch is a single upstream round-trip, not a long job.pending, then synced.4
Filter to the documents that drive deadlines
Docketing cares about specific kinds. Filter server-side by Each row carries a
document_kind and by official date so you only pull what changes a deadline.cURL
url. That is your handle to the file.5
Stream the office-action PDF into the matter
Follow the row’s Two rules for the proxy:
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.- 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_errorwithRetry-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 Because the row
official_date_gte set to your last run, and you only see what is new.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.
Related
- Trademark Documents: full endpoint reference
- Trademark Media: image proxy for logos and drawings
- Monitoring overview: get pushed on new filings instead of polling
- Renewal Management: the deadline side of docketing