Trademark data changes infrequently for most records. By leveraging ETags and conditional requests, you can avoid re-downloading unchanged data, reduce your rate limit consumption, and speed up your application.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.
How ETags Work
When you fetch a resource, the response includes anETag header containing a content fingerprint:
If-None-Match. If the resource has not changed, you get a 304 Not Modified with no body, saving bandwidth and processing time:
A
304 Not Modified response does not count against your rate limit, so using ETags effectively gives you free requests.Endpoints That Support ETags
| Endpoint | ETag Support | Typical max-age |
|---|---|---|
GET /v1/trademarks/:id | Yes | 300 s (5 min) |
GET /v1/owners/:id | Yes | 300 s |
GET /v1/attorneys/:id | Yes | 300 s |
GET /v1/firms/:id | Yes | 300 s |
GET /v1/offices | Yes | 3600 s (1 hour) |
GET /v1/jurisdictions | Yes | 3600 s |
GET /v1/trademarks (list/search) | No | — |
POST /v1/trademarks (search) | No | — |
POST /v1/trademarks/batch | No | — |
Cache-Control Headers
Every cacheable response includes aCache-Control header:
| Directive | Meaning |
|---|---|
private | Response is specific to this API key and must not be stored by shared caches (CDNs, proxies). |
max-age=N | The response is considered fresh for N seconds. After that, revalidate with If-None-Match. |
no-store | Present on mutation responses (POST, PATCH, DELETE). Do not cache. |
Conditional Request Flow
Caching Strategies for Trademark Data
Different types of trademark data have different change frequencies. Tailor your caching strategy accordingly.Reference Data (offices, jurisdictions, classifications)
These change only when Signa adds a new office or jurisdiction.- Strategy: Cache locally with a 24-hour TTL. Revalidate with ETags daily.
- Storage: In-memory or local file.
Individual Trademarks
Most trademark records change infrequently (a few times per year), but some change during active prosecution.- Strategy: Cache with the
max-agevalue from the response (typically 5 min). Revalidate with ETags after expiry. - Storage: In-memory cache (Redis, local Map) keyed by trademark ID.
Search Results
Search results are dynamic and depend on query parameters, so they are not ETag-cacheable.- Strategy: Client-side TTL cache keyed by the full query hash. A 30—60 second TTL works well for typeahead and repeated searches.
- Storage: In-memory only. Do not persist search result caches.
List Endpoints
Paginated lists may change as new records are added.- Strategy: Short TTL (60 s from
max-age). Revalidate with ETags. Note that the cursor itself provides consistency within a pagination session. - Storage: In-memory, keyed by the full URL including query parameters.
Cache Invalidation
ETags handle revalidation automatically: a conditionalGET against the same resource returns 304 Not Modified when the record is unchanged, so your cache entry stays valid and the request counts against your rate budget at the light-weight “not modified” rate.
For records you display in hot UI surfaces, complement ETag revalidation with a background refresh on the Trademark Changes endpoint — it returns the versioned change log for a specific mark, letting you invalidate a cache entry the moment a new version is detected without waiting for the next ETag check.
Multi-Tier Caching
For applications that display trademark data to end users, consider a two-tier approach:| Tier | TTL | Purpose |
|---|---|---|
| L1: In-process | 30—60 s | Eliminates redundant API calls within a single request cycle. |
| L2: Redis / Memcached | 5—15 min | Shares cached data across application instances. Uses ETag revalidation on miss. |