- Monthly quotas cap how many requests you can make against each pool over a billing period. Quotas reset on your billing anchor day (usually the first of the month).
- Rate limits cap how many requests per minute you can make against each endpoint type. Rate limits slide in real time and are separate from monthly quotas: a single request counts against both.
Monthly Quota Pools (Beta)
Endpoints are grouped into pools. Each pool has its own monthly allowance. During beta, every organization is on the same plan with the following limits:
The MCP server (
/mcp) is metered separately at 1,000 requests/min per organization; see MCP tools & permissions.
The health check endpoints and
GET /v1/openapi.json are unauthenticated and are not subject to any per-organization quota or rate limit.Pool rules of thumb
- List and search endpoints (returning many results, ranked or filtered) are search.
- Detail endpoints (returning one resource, or a batch of known IDs) are read.
- Static taxonomies (offices, classifications, design codes) are reference and never count against a monthly quota.
- Dashboard routes (usage, plan, API key management) are utility and never count against a monthly quota. Health and docs endpoints are unauthenticated and bypass rate limiting and quota entirely.
by_endpoint_type[*].limit.
Rate Limits
Each pool has a per-minute limit that applies regardless of HTTP method. This is the number you’ll see in theRateLimit-Policy header and the one you’ll normally hit.
One notable exception: POST /v1/trademarks/batch bills against the read pool (10,000/min), but because it’s a POST request its effective limit is 1,000/min, the same ceiling that applies to other mutating requests. If you’re bulk-hydrating IDs, pace batch calls accordingly.
Rate Limit Headers
API responses include IETF-standard rate limit headers so you can monitor your usage in real time. One exception: the CDN-cached reference-data routes (/v1/offices, /v1/jurisdictions, /v1/classifications, /v1/design-codes) omit the RateLimit-* headers, since they carry per-organization values that must not leak into a shared cache hit.
Daily Sub-Caps
In addition to the monthly quota, each metered pool has a daily sub-cap set at 10% of the monthly limit. Its purpose is to prevent a single client from exhausting an entire month’s allowance in minutes.
The daily counter resets at UTC midnight.
Daily quota headers
Every metered response includes three additional headers alongside the rate-limit headers:X-Quota-Limit, X-Quota-Remaining, and X-Quota-Reset report the monthly counter using the same shape. These headers count quota units (per day or per month), not requests per minute, so don’t confuse them with RateLimit-*. They’re omitted on unmetered pools (reference, utility) and on 404 responses, since neither spends quota.
429 with quota_scope
If a request exceeds either cap, you receive a 429 with error.type = "quota_exceeded". The error.quota_scope field tells you which counter was breached:
quota_scope is "monthly" or "daily". error.type stays "quota_exceeded" regardless; switch on quota_scope if you need to distinguish.
429 Response
When you exceed your rate limit, the API returns a429 Too Many Requests status with details about when you can retry:
Retry-After response header and the retry_after field in the body both contain the number of seconds to wait.
Monitoring Usage
Check your current billing period usage and rate limit status with Get Usage:by_endpoint_type reports used and limit for every metered pool: search, read, screening, and check. A limit of null means unlimited; 0 means the pool is not allowed on your plan.
rate_limits is the per-endpoint-type requests-per-minute map the limiter enforces, including the unmetered pools (monitoring, utility, reference) that still carry a per-minute ceiling even though they don’t spend a monthly quota.
Avoid polling
/v1/organization/usage in a tight loop. It is classified utility: unmetered against any monthly quota, but still subject to the utility per-minute rate limit (1,000/min on beta).Handling 429 in Code
The Signa TypeScript SDK handles 429 responses automatically with built-in retry logic; see SDK Error Handling. If you are implementing your own retry logic, wait for theRetry-After duration and retry with exponential backoff.
Best Practices
Use batch endpoints to reduce request count
Use batch endpoints to reduce request count
A single batch request of 100 IDs counts as 1 request against your rate limit, compared to 100 individual GET requests. See Batch Get Trademarks.
Use targeted lookups instead of frequent searches
Use targeted lookups instead of frequent searches
If you are periodically checking for trademark status changes, use Trademark History on specific marks rather than re-running broad searches.
Spread requests evenly
Spread requests evenly
Bursting 500 requests in the first second of a window is more likely to trigger rate limiting than spreading them evenly across the minute. If you need to process a large batch, add a small delay (50-100ms) between requests.
Use separate API keys per concern
Use separate API keys per concern
If your application has both a user-facing dashboard and a background sync job, create separate API keys for each. This prevents a background job from exhausting the rate limit that your dashboard users depend on.