Skip to main content
GET
List Deadlines
Credits: 1 per page. 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 1 credit, 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. A renewal cycle the office data proves paid (any cycle before the office-stated expiry, or the cycle the office’s recorded renewal paid) is not missed and is never listed. The default cutoff is 720 days after the computation date, within a five-year computation horizon. A due_before later than the horizon lists rows only up to it, and the response then carries warnings: [{ "code": "horizon_truncated" }] with a message naming the horizon date. Portfolios are capped at 5,000 marks; split larger portfolios. Results sort by due_date, trademark_id, then rule_id, all ascending, and are paginated. The cursor pins the computation date, so every page is computed for the same day, but records and portfolio membership can still change between pages. A mark whose deadlines could not be computed has no rows, so the envelope names it instead. unsupported_marks lists every mark in the requested portfolio or trademark that was not computed at all (supported: false, with reason unsupported_jurisdiction or requires_office_date) or was computed only in part (supported: true, with the declined rules in unsupported_rules), sorted by trademark_id. A mark whose status ends every obligation (abandoned, withdrawn, surrendered, invalidated, or refused other than a WIPO international registration) is never listed, because it is owed no deadlines in any jurisdiction. A missing anchor of a single rule lists an expired or cancelled mark only when its status can still be served that rule (for expired, any rule whose miss costs something, except a one-off rule of a national mark, whose window closed before its term did, and, with no renewal on record, the Philippine declaration due at the fifth anniversary of a renewal; for cancelled, a renewal that opens a modelled restoration window, which a Madrid designation never has), so a cancelled mark with no registration date in a jurisdiction with no restoration window is not listed for it. The whole-record checks do not depend on status: a cancelled Madrid designation with no international registration date, for example, is still listed with requires_office_date. These are the same fields a Compute Deadlines item carries without include_missed. With urgency=missed the list serves missed rows, so it also declines the rules whose missed rows lack their anchor, as compute does with include_missed: an expired or cancelled mark can be listed then and not on an unfiltered page. The list covers the whole scope, not just the page, and ignores the type and due_before filters and every urgency value but missed. It is reported on the first page (a request without cursor) and is null on every continuation page, because the cursor pins the computation date and the first page already answered for the chain. [] on a first page means every mark in scope was fully computed.
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: