Skip to main content
GET
List Deadlines
Supply exactly one of portfolio_id or trademark_id. Every request requires trademarks:read; a portfolio_id request additionally requires portfolios:manage, and a key missing either scope gets 403 forbidden. Portfolio requests return 404 for a portfolio outside your organization. Trademark requests accept any retrievable mark. Each page costs one read unit, with a default of 20 and a maximum of 100 rows. Deadlines are computed when requested. Rows carry rule_id, effective_from, last_verified, sources[], trigger_date, and trigger_field, alongside trademark identity, due date, window opening, grace expiry and urgency. sources[] holds the statutory citations behind the rule, the same ones Compute Deadlines returns; join rule_id to List Deadline Rules for the full rule record. For prosecution deadlines, use Compute Deadlines. Filter with a comma-separated type, an inclusive due_before date (YYYY-MM-DD), or urgency (critical, upcoming, routine, in_grace, missed). The list is forward-looking by default and omits deadlines whose grace period has already closed; urgency=missed selects exactly those rows instead. The default cutoff is 720 days after the computation date, within a five-year computation horizon. Portfolios are capped at 5,000 marks; split larger portfolios. Results sort by due_date, trademark_id, then rule_id, all ascending. Follow pagination.cursor while has_more is true. The signed cursor pins the computation date and binds the selector and filters. Keep those parameters unchanged on the next page. A cursor that fails to decode or verify — malformed, unsigned, minted for another endpoint, or an old offset cursor — returns 400 cursor_expired; a cursor that verifies but whose selector or filters have changed returns 400 cursor_invalid. Either way, restart at page one. Records and portfolio membership may change between pages: the cursor pins the clock, not a historical snapshot. GET /v1/portfolios/{id}/deadlines is an alias using the same rows, filters and cursor. Both paths preserve the portfolio list’s inclusive cutoff semantics, and a cursor minted on one can be followed on the other. The alias differs in one deliberate way: it requires portfolios:manage alone, without the base trademarks:read this path also requires, because its scope is unchanged from the day it shipped and adding a required scope to a published operation would break existing keys.
A single row looks like this: