@signa-so/sdk 0.9.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +2 -7
  2. package/dist/client.d.ts +11 -8
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +14 -10
  5. package/dist/client.js.map +1 -1
  6. package/dist/errors.d.ts +54 -1
  7. package/dist/errors.d.ts.map +1 -1
  8. package/dist/errors.js +80 -3
  9. package/dist/errors.js.map +1 -1
  10. package/dist/generated/api-types.d.ts +13251 -6295
  11. package/dist/generated/api-types.d.ts.map +1 -1
  12. package/dist/index.d.ts +2 -2
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +1 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/pagination.d.ts +23 -2
  17. package/dist/pagination.d.ts.map +1 -1
  18. package/dist/pagination.js +45 -4
  19. package/dist/pagination.js.map +1 -1
  20. package/dist/resources/citations.d.ts +33 -0
  21. package/dist/resources/citations.d.ts.map +1 -0
  22. package/dist/resources/citations.js +38 -0
  23. package/dist/resources/citations.js.map +1 -0
  24. package/dist/resources/credits.d.ts +7 -0
  25. package/dist/resources/credits.d.ts.map +1 -0
  26. package/dist/resources/credits.js +8 -0
  27. package/dist/resources/credits.js.map +1 -0
  28. package/dist/resources/deadlines.d.ts +38 -4
  29. package/dist/resources/deadlines.d.ts.map +1 -1
  30. package/dist/resources/deadlines.js +39 -2
  31. package/dist/resources/deadlines.js.map +1 -1
  32. package/dist/resources/entities.d.ts +6 -7
  33. package/dist/resources/entities.d.ts.map +1 -1
  34. package/dist/resources/entities.js +6 -7
  35. package/dist/resources/entities.js.map +1 -1
  36. package/dist/resources/events.d.ts.map +1 -1
  37. package/dist/resources/events.js +4 -1
  38. package/dist/resources/events.js.map +1 -1
  39. package/dist/resources/fees.d.ts +10 -0
  40. package/dist/resources/fees.d.ts.map +1 -0
  41. package/dist/resources/fees.js +14 -0
  42. package/dist/resources/fees.js.map +1 -0
  43. package/dist/resources/goods-services.d.ts +36 -2
  44. package/dist/resources/goods-services.d.ts.map +1 -1
  45. package/dist/resources/goods-services.js +37 -1
  46. package/dist/resources/goods-services.js.map +1 -1
  47. package/dist/resources/organization.d.ts +8 -1
  48. package/dist/resources/organization.d.ts.map +1 -1
  49. package/dist/resources/organization.js +9 -0
  50. package/dist/resources/organization.js.map +1 -1
  51. package/dist/resources/portfolios.d.ts +46 -20
  52. package/dist/resources/portfolios.d.ts.map +1 -1
  53. package/dist/resources/portfolios.js +39 -5
  54. package/dist/resources/portfolios.js.map +1 -1
  55. package/dist/resources/reconcile.d.ts +21 -1
  56. package/dist/resources/reconcile.d.ts.map +1 -1
  57. package/dist/resources/reconcile.js +21 -1
  58. package/dist/resources/reconcile.js.map +1 -1
  59. package/dist/resources/references.d.ts +21 -9
  60. package/dist/resources/references.d.ts.map +1 -1
  61. package/dist/resources/references.js +26 -11
  62. package/dist/resources/references.js.map +1 -1
  63. package/dist/resources/trademarks.d.ts +42 -4
  64. package/dist/resources/trademarks.d.ts.map +1 -1
  65. package/dist/resources/trademarks.js +284 -3
  66. package/dist/resources/trademarks.js.map +1 -1
  67. package/dist/resources/watches.d.ts +3 -7
  68. package/dist/resources/watches.d.ts.map +1 -1
  69. package/dist/resources/watches.js +2 -16
  70. package/dist/resources/watches.js.map +1 -1
  71. package/dist/types.d.ts +1187 -573
  72. package/dist/types.d.ts.map +1 -1
  73. package/dist/version.d.ts +1 -1
  74. package/dist/version.d.ts.map +1 -1
  75. package/dist/version.js +1 -1
  76. package/dist/version.js.map +1 -1
  77. package/package.json +3 -3
  78. package/dist/resources/saved-searches.d.ts +0 -22
  79. package/dist/resources/saved-searches.d.ts.map +0 -1
  80. package/dist/resources/saved-searches.js +0 -39
  81. package/dist/resources/saved-searches.js.map +0 -1
  82. package/dist/resources/suggest.d.ts +0 -16
  83. package/dist/resources/suggest.d.ts.map +0 -1
  84. package/dist/resources/suggest.js +0 -18
  85. package/dist/resources/suggest.js.map +0 -1
package/dist/types.d.ts CHANGED
@@ -1,207 +1,54 @@
1
- import type { components } from './generated/api-types.js';
1
+ import type { components, operations } from './generated/api-types.js';
2
2
  /** Full trademark with all optional includes (retrieve response). */
3
3
  export type Trademark = components['schemas']['TrademarkDetailResponse'];
4
- /** Compact trademark in list responses. */
4
+ /**
5
+ * The one trademark row (0.14.0): search hits, `list()` rows, party and
6
+ * portfolio trademark lists and screening hits all return it. Top-level dates
7
+ * are the office's values (null when it published none); everything the
8
+ * rulebook computes is under `derived`. IR family rows (a grouped Madrid
9
+ * family) also carry `coverage`, `source_records` and `owners_mixed`.
10
+ */
5
11
  export type TrademarkSummary = components['schemas']['TrademarkSummaryV1'];
12
+ /** Which unit a trademark row is: a `mark` (standalone filing or IR family) or one `record` (a leg). */
13
+ export type TrademarkGrain = TrademarkSummary['grain'];
6
14
  /** One inline `relationships[]` edge on the trademark detail. */
7
15
  export type TrademarkRelationship = components['schemas']['TrademarkRelationship'];
8
- /** Trademark prosecution event (GET /v1/trademarks/{id}/events). */
9
- export type Event = components['schemas']['TrademarkEvent'];
10
- /** Stats object shape returned by ?include=stats on attorney detail. */
11
- export interface AttorneyStats {
12
- trademark_count: number | null;
13
- registered_count: number | null;
14
- expired_count: number | null;
15
- cancelled_count: number | null;
16
- pending_count: number | null;
17
- abandoned_count: number | null;
18
- /** @deprecated Use `grant_rate` — same value. `registration_rate` is a misnomer (share of concluded prosecutions ever granted, not share currently registered). */
19
- registration_rate: number | null;
20
- /** Share of concluded prosecutions that were ever granted. Same value as the deprecated `registration_rate`. */
21
- grant_rate: number | null;
22
- abandonment_rate: number | null;
23
- avg_prosecution_days: number | null;
24
- jurisdiction_count: number | null;
25
- earliest_filing: string | null;
26
- latest_filing: string | null;
27
- computed_at: string | null;
28
- }
29
- /** Stats object shape returned by ?include=stats on owner detail. */
30
- export interface OwnerStats {
31
- trademark_count: number | null;
32
- registered_count: number | null;
33
- expired_count: number | null;
34
- cancelled_count: number | null;
35
- pending_count: number | null;
36
- abandoned_count: number | null;
37
- /** @deprecated Use `grant_rate` — same value. `registration_rate` is a misnomer (share of concluded prosecutions ever granted, not share currently registered). */
38
- registration_rate: number | null;
39
- /** Share of concluded prosecutions that were ever granted. Same value as the deprecated `registration_rate`. */
40
- grant_rate: number | null;
41
- abandonment_rate: number | null;
42
- jurisdiction_count: number | null;
43
- earliest_filing: string | null;
44
- latest_filing: string | null;
45
- computed_at: string | null;
46
- }
47
- /** Full owner detail (retrieve response). */
48
- export type Owner = components['schemas']['OwnerResponse'] & {
49
- trademark_count?: number | null;
50
- active_count?: number | null;
51
- /** @deprecated Use `grant_rate` — same value; `registration_rate` is a misnomer. */
52
- registration_rate?: number | null;
53
- /** Share of concluded prosecutions that were ever granted. Same value as the deprecated `registration_rate`. */
54
- grant_rate?: number | null;
55
- latest_filing?: string | null;
56
- /** Resolved-entity id this owner belongs to (the derived `ent_<owner-uuid>`
57
- * singleton when unlinked). Always present. */
58
- entity_id?: string;
59
- entity_id_type?: 'resolved' | 'derived';
60
- /** Whether the (possibly entity-inherited) company set includes an active SEC
61
- * company with a ticker. */
62
- publicly_traded?: boolean;
63
- /** First SEC ticker across the (possibly inherited) company set. */
64
- ticker?: string | null;
65
- /** First GLEIF LEI across the (possibly inherited) company set. */
66
- lei?: string | null;
67
- /** Whether any GLEIF LEI is present across the (possibly inherited) set. */
68
- has_lei?: boolean;
69
- /** `entity` when company facts are inherited across entity members; `direct`
70
- * for an unlinked singleton. */
71
- companies_source?: 'entity' | 'direct';
72
- /** Public companies — when linked, the union of all members' company links
73
- * (served through the entity). Omitted entirely when empty. */
74
- companies?: EntityCompany[];
75
- related_entities?: {
76
- parent: {
77
- id: string;
78
- object: 'owner';
79
- name: string;
80
- canonical_name: string;
81
- country_code: string | null;
82
- entity_type: string | null;
83
- } | null;
84
- children: Array<{
85
- id: string;
86
- object: 'owner';
87
- name: string;
88
- canonical_name: string;
89
- country_code: string | null;
90
- entity_type: string | null;
91
- }>;
92
- };
93
- stats?: OwnerStats;
94
- };
16
+ /**
17
+ * A prosecution-history row (`GET /v1/trademarks/{id}/events`): object
18
+ * `trademark_event`, `hst_` id, the office's code and label in `raw`. The same
19
+ * object is `trademark_event` on an `office_action.issued` v2 payload.
20
+ */
21
+ export type TrademarkEvent = components['schemas']['TrademarkEvent'];
22
+ /** Alias of {@link TrademarkEvent}. */
23
+ export type Event = TrademarkEvent;
24
+ /** Stats object on attorney detail (`stats`), null until first computed. */
25
+ export type AttorneyStats = NonNullable<components['schemas']['Attorney']['stats']>;
26
+ /** Stats object on owner detail (`stats`), null until first computed. */
27
+ export type OwnerStats = NonNullable<components['schemas']['Owner']['stats']>;
28
+ /**
29
+ * The one address shape (0.14.0) on owners, attorneys, trademark parties and
30
+ * assignment parties: `lines` verbatim from the office, components only when
31
+ * the office supplied them, `formatted` the office's own single-string
32
+ * rendering (null when it sent components only). Fields holding an address
33
+ * are `Address | null`.
34
+ */
35
+ export type Address = NonNullable<components['schemas']['Address']>;
36
+ /**
37
+ * Full owner detail (retrieve response). `entity_id` is the resolved entity
38
+ * the owner is linked into, or `null` when it is not linked (0.14.0: no
39
+ * derived `ent_<owner-uuid>` id and no `entity_id_type`).
40
+ */
41
+ export type Owner = components['schemas']['OwnerResponse'];
95
42
  /** Composed live portfolio analytics report for an owner, attorney, firm, or entity. */
96
- export interface AnalyticsReport {
97
- object: 'analytics_report';
98
- subject: {
99
- id: string;
100
- object: 'owner' | 'attorney' | 'firm' | 'entity';
101
- name: string;
102
- };
103
- portfolio: {
104
- mark_count: number;
105
- active_count: number;
106
- dead_count: number;
107
- status_distribution: Record<string, number>;
108
- class_distribution: Record<string, number>;
109
- jurisdiction_spread: Record<string, number>;
110
- filing_trend: Record<string, number>;
111
- };
112
- litigation: {
113
- subject: {
114
- owner_id: string | null;
115
- entity_id: string | null;
116
- };
117
- proceedings_total: number;
118
- as_challenger: {
119
- total: number;
120
- by_type: Record<string, number>;
121
- outcomes: Record<string, number>;
122
- decided: number;
123
- win_rate: number | null;
124
- avg_duration_days: number | null;
125
- };
126
- as_defendant: {
127
- total: number;
128
- by_type: Record<string, number>;
129
- outcomes: Record<string, number>;
130
- decided: number;
131
- win_rate: number | null;
132
- avg_duration_days: number | null;
133
- };
134
- } | null;
135
- transactions: {
136
- transaction_count: number;
137
- by_type: Record<string, number>;
138
- unreleased_security_interests: number;
139
- marks_with_liens: number;
140
- acquired_count: number;
141
- divested_count: number;
142
- first_transaction_date: string | null;
143
- last_transaction_date: string | null;
144
- } | null;
145
- generated_at: string;
146
- /** Per-request id echoed at the top level of the response body (`AnalyticsReportResponse` in the OpenAPI spec). */
147
- request_id: string;
148
- }
149
- /** Compact owner in list responses. */
150
- export type OwnerSummary = components['schemas']['OwnerSummary'] & {
151
- trademark_count?: number | null;
152
- active_count?: number | null;
153
- /** @deprecated Use `grant_rate` — same value; `registration_rate` is a misnomer. */
154
- registration_rate?: number | null;
155
- /** Share of concluded prosecutions that were ever granted. Same value as the deprecated `registration_rate`. */
156
- grant_rate?: number | null;
157
- latest_filing?: string | null;
158
- entity_id?: string;
159
- entity_id_type?: 'resolved' | 'derived';
160
- };
43
+ export type AnalyticsReport = components['schemas']['AnalyticsReportResponse'];
44
+ /** Compact owner in list responses. `entity_id` is the linked entity or `null`. */
45
+ export type OwnerSummary = components['schemas']['OwnerSummary'];
161
46
  /** Full attorney detail (retrieve response). */
162
- export type Attorney = components['schemas']['AttorneyResponse'] & {
163
- firm_id?: string | null;
164
- email?: string | null;
165
- phone?: string | null;
166
- address?: unknown | null;
167
- trademark_count?: number | null;
168
- active_count?: number | null;
169
- /** @deprecated Use `grant_rate` — same value; `registration_rate` is a misnomer. */
170
- registration_rate?: number | null;
171
- /** Share of concluded prosecutions that were ever granted. Same value as the deprecated `registration_rate`. */
172
- grant_rate?: number | null;
173
- latest_filing?: string | null;
174
- recent_trademarks?: Array<Record<string, unknown>>;
175
- recent_trademarks_has_more?: boolean;
176
- stats?: AttorneyStats;
177
- };
47
+ export type Attorney = components['schemas']['AttorneyResponse'];
178
48
  /** Compact attorney in list responses. */
179
- export type AttorneySummary = components['schemas']['AttorneySummary'] & {
180
- firm_id?: string | null;
181
- trademark_count?: number | null;
182
- active_count?: number | null;
183
- /** @deprecated Use `grant_rate` — same value; `registration_rate` is a misnomer. */
184
- registration_rate?: number | null;
185
- /** Share of concluded prosecutions that were ever granted. Same value as the deprecated `registration_rate`. */
186
- grant_rate?: number | null;
187
- latest_filing?: string | null;
188
- };
189
- /** Full firm detail (retrieve response). */
190
- export interface Firm {
191
- id: string;
192
- object: 'firm';
193
- name: string;
194
- canonical_name: string;
195
- attorney_count: number;
196
- trademark_count: number;
197
- active_count: number;
198
- /** @deprecated Use `grant_rate` — same value; `registration_rate` is a misnomer. */
199
- registration_rate: number | null;
200
- /** Share of concluded prosecutions that were ever granted. Same value as the deprecated `registration_rate`. */
201
- grant_rate: number | null;
202
- latest_filing: string | null;
203
- created_at: string;
204
- updated_at: string;
49
+ export type AttorneySummary = components['schemas']['AttorneySummary'];
50
+ /** Full firm detail (retrieve response); `attorneys` only with `include: ['attorneys']`. */
51
+ export type Firm = components['schemas']['FirmResponse'] & {
205
52
  attorneys?: Array<{
206
53
  id: string;
207
54
  object: 'attorney';
@@ -212,161 +59,60 @@ export interface Firm {
212
59
  trademark_count: number | null;
213
60
  }>;
214
61
  attorneys_has_more?: boolean;
215
- request_id: string;
216
- }
62
+ };
217
63
  /** Compact firm in list responses. */
218
- export interface FirmSummary {
219
- id: string;
220
- object: 'firm';
221
- name: string;
222
- canonical_name: string;
223
- attorney_count: number;
224
- trademark_count: number;
225
- active_count: number;
226
- /** @deprecated Use `grant_rate` — same value; `registration_rate` is a misnomer. */
227
- registration_rate: number | null;
228
- /** Share of concluded prosecutions that were ever granted. Same value as the deprecated `registration_rate`. */
229
- grant_rate: number | null;
230
- latest_filing: string | null;
231
- created_at: string;
232
- }
64
+ export type FirmSummary = components['schemas']['FirmSummary'];
233
65
  /** Public-company reference inherited onto an entity member / owner. */
234
- export interface EntityCompany {
235
- source: 'sec' | 'gleif';
236
- source_id: string;
237
- legal_name?: string;
238
- ticker: string | null;
239
- exchange: string | null;
240
- lei: string | null;
241
- entity_status: string;
242
- confidence?: number;
243
- verified_at?: string | null;
244
- verified_by?: string | null;
245
- }
246
- /** Public per-member link provenance on an entity-detail member. */
247
- export interface EntityMemberLink {
248
- /** How this member was linked into the entity (stable public vocabulary). */
249
- method: 'international_registration' | 'shared_identifier' | 'public_company' | 'portfolio_overlap' | 'manual_review' | 'other';
250
- /** Coarse confidence band; null when not scored. */
251
- match_strength: 'high' | 'medium' | 'low' | null;
252
- /** Whether the link was confirmed by adjudication/manual review. */
253
- reviewed: boolean;
254
- /** matched canonical IR numbers (international_registration), when present. */
255
- matched_irs?: string[];
256
- /** matched office-identifier values (shared_identifier), when present. */
257
- matched_identifiers?: string[];
258
- }
66
+ export type EntityCompany = NonNullable<components['schemas']['Owner']['companies']>[number];
67
+ /** Public per-member link provenance on an entity-detail member. Never null. */
68
+ export type EntityMemberLink = components['schemas']['EntityMemberLink'];
259
69
  /** A member owner embedded in an entity-detail response. */
260
- export interface EntityMember {
261
- id: string;
262
- object: 'owner';
263
- name: string;
264
- canonical_name: string;
265
- country_code: string | null;
266
- entity_type: string | null;
267
- office_code: string | null;
268
- /** null on a derived singleton's self-member (it was never linked). */
269
- link: EntityMemberLink | null;
270
- }
70
+ export type EntityMember = components['schemas']['EntityMember'];
271
71
  /** Compact entity in list responses (`GET /v1/entities`). */
272
- export interface EntitySummary {
273
- id: string;
274
- object: 'entity';
275
- name: string;
276
- country_code: string | null;
277
- entity_type: string | null;
278
- entity_id_type: 'resolved' | 'derived';
279
- publicly_traded: boolean;
280
- ticker: string | null;
281
- lei: string | null;
282
- trademark_count: number;
283
- active_count: number;
284
- member_count: number;
285
- }
286
- /** The nearest listed ancestor of a `subsidiary_of_listed` entity, when it
287
- * resolves to a live entity in our system. */
288
- export interface EntityListedAncestor {
289
- id: string;
290
- object: 'entity';
291
- name: string;
292
- /** The listed ancestor's own ticker. */
293
- ticker: string | null;
294
- }
295
- /** Public-listing decoration (ENG-117). Present on {@link EntityDetail} ONLY when
296
- * the entity is listed or a subsidiary of a listed company; OMITTED otherwise
297
- * (absence ≠ confirmed-private). */
298
- export interface EntityListing {
299
- /** 'listed' = the entity is itself publicly listed; 'subsidiary_of_listed' =
300
- * it inherits a ticker from a listed ancestor. */
301
- status: 'listed' | 'subsidiary_of_listed';
302
- /** The entity's own ticker (listed) or the inherited ancestor ticker (subsidiary). */
303
- ticker: string | null;
304
- /** Exchange / market code (display only). */
305
- exch_code: string | null;
306
- /** LEI of the listed company: the entity's own LEI when listed, else the ancestor's. */
307
- lei: string | null;
308
- /** Derived from status: 'listed' → 'direct', 'subsidiary_of_listed' → 'inherited'. */
309
- source: 'direct' | 'inherited';
310
- /** The nearest listed ancestor; null for a directly-listed entity or when unresolvable. */
311
- listed_ancestor: EntityListedAncestor | null;
312
- }
313
- /** Full entity detail (`GET /v1/entities/{id}`). Resolved entities embed
314
- * members[] with link evidence; derived singletons carry a member-of-one. */
315
- export interface EntityDetail {
316
- id: string;
317
- object: 'entity';
318
- name: string;
319
- country_code: string | null;
320
- entity_type: string | null;
321
- entity_id_type: 'resolved' | 'derived';
322
- /** True when a member company is an active SEC ticker OR the entity itself is
323
- * listed / a subsidiary of a listed company (ENG-117 — matches the list filter).
324
- * A derived singleton exposes the owner's own public-company facts (pco-linked),
325
- * else false. */
326
- publicly_traded: boolean;
327
- /** Survivorship ticker (first of {@link tickers}); null when none. */
328
- ticker: string | null;
329
- /** Deduped uppercased tickers: member-company SEC tickers UNION the entity's own
330
- * direct/inherited (subsidiary_of_listed) listing_ticker (ENG-117). Includes
331
- * inherited subsidiary tickers; direct-vs-inherited provenance is in {@link listing}. */
332
- tickers: string[];
333
- lei: string | null;
334
- /** Whether any member company carries a GLEIF LEI. */
335
- has_lei: boolean;
336
- trademark_count: number;
337
- active_count: number;
338
- member_count: number;
339
- /** Resolved entities only — the GLEIF parent entity id, when present. */
340
- parent_entity_id?: string | null;
341
- /** Public-listing block (ENG-117). Present only when the entity is listed or a
342
- * subsidiary of a listed company; omitted otherwise. */
343
- listing?: EntityListing;
344
- members: EntityMember[];
345
- updated_at: string;
346
- request_id: string;
347
- }
72
+ export type EntitySummary = components['schemas']['EntitySummary'];
73
+ /** The nearest listed ancestor of a `subsidiary_of_listed` entity. */
74
+ export type EntityListedAncestor = components['schemas']['EntityListedAncestor'];
75
+ /**
76
+ * Public-listing decoration (ENG-117). Present on {@link EntityDetail} ONLY when
77
+ * the entity is listed or a subsidiary of a listed company; OMITTED otherwise
78
+ * (absence is not confirmed-private).
79
+ */
80
+ export type EntityListing = components['schemas']['EntityListing'];
81
+ /** Full entity detail (`GET /v1/entities/{id}`), members[] with link evidence. */
82
+ export type EntityDetail = components['schemas']['EntityResponse'];
348
83
  /** A node in an entity's GLEIF family (`GET /v1/entities/{id}/family`). */
349
- export interface EntityFamilyNode {
350
- id: string;
351
- object: 'entity';
352
- name: string;
353
- country_code: string | null;
354
- relationship: 'parent' | 'direct_subsidiary';
355
- source: 'gleif';
356
- }
84
+ export type EntityFamilyNode = components['schemas']['EntityFamilyNode'];
357
85
  /** GLEIF-curated direct family (parent + direct children, 1 level). */
358
- export interface EntityFamily {
359
- object: 'entity_family';
360
- parent: EntityFamilyNode | null;
361
- children: EntityFamilyNode[];
362
- source: 'gleif';
363
- coverage_caveat: string;
364
- request_id: string;
365
- }
86
+ export type EntityFamily = components['schemas']['EntityFamilyResponse'];
366
87
  /** Proceeding in list responses. */
367
88
  export type Proceeding = components['schemas']['Proceeding'];
368
89
  /** Full proceeding detail with embedded trademark (retrieve response). */
369
90
  export type ProceedingDetail = components['schemas']['ProceedingResponse'];
91
+ /**
92
+ * An office-action citation: a prior mark an examiner cited against a pending
93
+ * application. USPTO §2(d) refusals today — see `capabilities.citations` on
94
+ * `signa.references.offices()` for per-office coverage.
95
+ */
96
+ export type Citation = components['schemas']['Citation'];
97
+ /**
98
+ * Citing/cited mark summary embedded in a citation. Null means there is no
99
+ * persisted link to a Signa record, NOT that the mark is absent from the
100
+ * register: resolution runs once, at extraction time, so a mark ingested after
101
+ * its citations were extracted keeps a null link forever. Read a null
102
+ * `cited_trademark` as "matched by reference only" and use `cited_ref`.
103
+ */
104
+ export type CitationTrademarkSummary = components['schemas']['CitationTrademarkSummary'];
105
+ /** How a citation resolved. Null while pending the daily disposition refresh. */
106
+ export type CitationDisposition = NonNullable<Citation['disposition']>;
107
+ /**
108
+ * Office-action stage the citation REACHED — not provenance about the source
109
+ * document. A citation first raised in a nonfinal action reads `final` once a
110
+ * later dated final action maintained the refusal, so `final` does not mean the
111
+ * row was extracted from a final action.
112
+ */
113
+ export type CitationActionStage = NonNullable<Citation['action_stage']>;
114
+ /** Office-local refusal ground vocabulary (USPTO `2d` = §2(d) confusion). */
115
+ export type CitationRefusalType = Citation['refusal_type'];
370
116
  /** Recorded assignment in list responses. */
371
117
  export type Assignment = components['schemas']['Assignment'];
372
118
  /** Full assignment detail with parties and affected marks. */
@@ -381,12 +127,64 @@ export type TrademarkBatchResponse = components['schemas']['TrademarkBatchRespon
381
127
  export type TrademarkSuggestion = components['schemas']['TrademarkSuggestion'];
382
128
  /** Attorney client (owner) entry with shared count. */
383
129
  export type AttorneyClient = components['schemas']['AttorneyClient'];
384
- /** Search result item (V2 with match explanations and faceted aggregations). */
385
- export type TrademarkSearchResult = components['schemas']['TrademarkSearchResult'];
386
- /** Cross-entity suggestion item. */
387
- export type CrossEntitySuggestion = components['schemas']['CrossEntitySuggestion'];
130
+ /**
131
+ * @deprecated Since 0.14.0 search hits, list rows and portfolio rows are one
132
+ * type: use {@link TrademarkSummary}. This alias is the same type.
133
+ */
134
+ export type TrademarkSearchResult = TrademarkSummary;
388
135
  /** Goods & services term (Nice classification). */
389
136
  export type GoodsServicesTerm = components['schemas']['GoodsServicesTerm'];
137
+ /** Request body for `POST /v1/goods-services/validate`. */
138
+ export type GoodsServicesValidateParams = Omit<components['schemas']['GoodsServicesValidateRequest'], 'language'> & {
139
+ /** Catalog language. Defaults to `en`; no other language is available in v1. */
140
+ language?: 'en';
141
+ };
142
+ /** One submitted item in a goods/services catalog validation request. */
143
+ export type GoodsServicesValidateItem = components['schemas']['GoodsServicesValidateItem'];
144
+ /** One per-item result from goods/services catalog validation. */
145
+ export type GoodsServicesValidation = components['schemas']['GoodsServicesValidation'];
146
+ /** Advisory same-class wording or USPTO template candidate. */
147
+ export type GoodsServicesValidationCandidate = components['schemas']['GoodsServicesValidationCandidate'];
148
+ /** Half-open token span into the submitted wording. */
149
+ export type GoodsServicesValidationSpan = components['schemas']['GoodsServicesValidationSpan'];
150
+ /** USPTO drafting template attached to a template candidate. */
151
+ export type GoodsServicesValidationTemplate = components['schemas']['GoodsServicesValidationTemplate'];
152
+ /** One fillable placeholder in a USPTO drafting template. */
153
+ export type GoodsServicesValidationTemplateSlot = components['schemas']['GoodsServicesValidationTemplateSlot'];
154
+ /** Descriptive token coverage for one submitted item. */
155
+ export type GoodsServicesValidationCoverage = components['schemas']['GoodsServicesValidationCoverage'];
156
+ /** Whether same-class candidate search completed reliably. */
157
+ export type CandidateSearch = components['schemas']['CandidateSearch'];
158
+ /** Why same-class candidate search did not complete. */
159
+ export type CandidateSearchReason = components['schemas']['CandidateSearchReason'];
160
+ /** Suggested class provenance when `class_source` is `inferred`. */
161
+ export type GoodsServicesClassInference = NonNullable<GoodsServicesValidation['class_inference']>;
162
+ /** Source of the resolved Nice class, including advisory inference. */
163
+ export type GoodsServicesClassSource = GoodsServicesValidation['class_source'];
164
+ /** Cited, non-predictive guidance about potentially indefinite wording. */
165
+ export type WordingWarning = components['schemas']['WordingWarning'];
166
+ /** Catalog source and its last-known upstream refresh date. */
167
+ export type GoodsServicesValidationCatalogFreshness = components['schemas']['GoodsServicesValidationCatalogFreshness'];
168
+ /** Candidate-search rollup across all submitted items. */
169
+ export type GoodsServicesValidationSummaryCandidateSearch = components['schemas']['GoodsServicesValidationSummaryCandidateSearch'];
170
+ /** Warning totals grouped by severity. */
171
+ export type GoodsServicesValidationSummaryWarningCount = components['schemas']['GoodsServicesValidationSummaryWarningCount'];
172
+ /** Full response from `POST /v1/goods-services/validate`. */
173
+ export type GoodsServicesValidationResponse = components['schemas']['GoodsServicesValidationListResponse'];
174
+ /** Item-level catalog validation status. */
175
+ export type ValidationItemStatus = components['schemas']['ValidationItemStatus'];
176
+ /** Per-office catalog validation status. */
177
+ export type OfficeVerdictStatus = components['schemas']['OfficeVerdictStatus'];
178
+ export type FeeRule = components['schemas']['FeeRule'];
179
+ export type FeeSource = components['schemas']['FeeSource'];
180
+ export type FeeEstimateLine = components['schemas']['FeeEstimateLine'];
181
+ export type FeeEstimateParams = components['schemas']['FeeEstimateRequest'];
182
+ export type FeeEstimate = components['schemas']['FeeEstimateResponse'];
183
+ export type FeeListResponse = components['schemas']['FeeListResponse'];
184
+ export type FeeListParams = {
185
+ office?: string;
186
+ action?: FeeEstimateParams['action'];
187
+ };
390
188
  /** Single maintenance deadline rule (item in `GET /v1/deadline-rules`). */
391
189
  export type DeadlineRule = components['schemas']['DeadlineRule'];
392
190
  /** Single computed maintenance deadline. */
@@ -394,11 +192,53 @@ export type ComputedDeadline = components['schemas']['ComputedDeadline'];
394
192
  /** Per-item result from `POST /v1/deadlines/compute`. */
395
193
  export type DeadlineComputation = components['schemas']['DeadlineComputation'];
396
194
  /** Input item for `POST /v1/deadlines/compute`. */
397
- export type DeadlineComputeItem = components['schemas']['DeadlineComputeItem'];
195
+ export type DeadlineComputeItem = components['schemas']['DeadlineComputeRequest']['items'][number];
196
+ export type DeadlineComputeResult = components['schemas']['DeadlineComputeResponse']['data'][number];
197
+ export type DeadlineListRow = components['schemas']['DeadlineListRow'];
198
+ /**
199
+ * A maintenance rule that applies to a mark but was declined because the
200
+ * record lacks the date the statute anchors it on, so no deadline row exists
201
+ * for it. Carried as `unsupported_rules` on `POST /v1/deadlines/compute`
202
+ * items and `unsupported_marks[]` entries, and as
203
+ * `derived.deadlines.unsupported_rules` on a trademark row.
204
+ */
205
+ export type UnsupportedDeadlineRule = components['schemas']['UnsupportedDeadlineRule'];
206
+ /**
207
+ * A mark in a deadline list's scope whose schedule was not computed
208
+ * (`supported: false`, no rows) or computed only in part (`supported: true`
209
+ * with `unsupported_rules`). Same coverage fields as a compute item.
210
+ */
211
+ export type DeadlineUnsupportedMark = components['schemas']['DeadlineUnsupportedMark'];
212
+ export type DeadlineListParams = Omit<NonNullable<operations['listDeadlines']['parameters']['query']>, 'portfolio_id' | 'trademark_id'> & ({
213
+ portfolio_id: string;
214
+ trademark_id?: never;
215
+ } | {
216
+ trademark_id: string;
217
+ portfolio_id?: never;
218
+ });
398
219
  /** Request body for `POST /v1/deadlines/compute`. */
399
220
  export type DeadlineComputeParams = components['schemas']['DeadlineComputeRequest'];
400
221
  /** List response from `POST /v1/deadlines/compute`. */
401
222
  export type DeadlineComputeResponse = components['schemas']['DeadlineComputeResponse'];
223
+ /**
224
+ * Why a deadline was not computed.
225
+ *
226
+ * Open enum — widened in the prosecution release from two maintenance values
227
+ * to the full engine vocabulary. Keep a default branch.
228
+ */
229
+ export type DeadlineUnsupportedReason = components['schemas']['DeadlineUnsupportedReason'];
230
+ /** Per-deadline-type capability on a `POST /v1/deadlines/compute` result. */
231
+ export type DeadlineSupport = components['schemas']['DeadlineSupport'];
232
+ /** One prosecution fact instance sent on `items[].facts`. */
233
+ export type ProsecutionFact = components['schemas']['ProsecutionFact'];
234
+ /** The maintenance filing under examination, for post-registration refusals. */
235
+ export type ProsecutionMaintenanceFiling = components['schemas']['ProsecutionMaintenanceFiling'];
236
+ /** One computed prosecution deadline, with the rule provenance behind it. */
237
+ export type ProsecutionDeadline = components['schemas']['ProsecutionDeadline'];
238
+ /** The rule identity + sources stamped onto a computed prosecution deadline. */
239
+ export type ProsecutionRuleIdentity = components['schemas']['ProsecutionRuleIdentity'];
240
+ /** A citable source behind a prosecution rule. */
241
+ export type ProsecutionRuleSource = components['schemas']['ProsecutionRuleSource'];
402
242
  /** Single opposition window rule (item in `GET /v1/opposition-rules`). */
403
243
  export type OppositionRule = components['schemas']['OppositionRule'];
404
244
  /** Common extension available for an opposition window, when modeled. */
@@ -425,6 +265,20 @@ export type ReconcileParams = components['schemas']['ReconcileRequest'];
425
265
  export type Reconciliation = components['schemas']['Reconciliation'];
426
266
  /** List response from `POST /v1/reconcile`. */
427
267
  export type ReconcileResponse = components['schemas']['ReconcileResponse'];
268
+ /** Three-source per-field verdict row (`POST /v1/reconcile` with `verdict_detail: true`). */
269
+ export type FieldVerdict = components['schemas']['ReconcileFieldVerdict'];
270
+ /** The 7-value verdict partition on a `FieldVerdict`. */
271
+ export type ReconcileVerdict = FieldVerdict['verdict'];
272
+ /** Which sources produced a value for a `FieldVerdict`. */
273
+ export type VerdictBasis = FieldVerdict['basis'];
274
+ /** One caller-docketed deadline (`your_fields.docketed_deadlines[]`, requires `verdict_detail: true`). */
275
+ export type DocketedDeadline = components['schemas']['DocketedDeadline'];
276
+ /** Identifier-interpretation echo on a verdict_detail result. */
277
+ export type ReconcileLookup = components['schemas']['ReconcileLookup'];
278
+ /** Computed-schedule context on a verdict_detail result. */
279
+ export type ReconcileComputedContext = components['schemas']['ReconcileComputedContext'];
280
+ /** Totals over `field_verdicts[]` — every verdict key explicit. */
281
+ export type ReconcileVerdictCounts = components['schemas']['ReconcileVerdictCounts'];
428
282
  /** Statutory citation + URL surfaced on rule items. */
429
283
  export type RuleSource = components['schemas']['RuleSource'];
430
284
  /** Vienna design code. */
@@ -468,43 +322,119 @@ export interface CastOfficeVotesParams {
468
322
  export type Jurisdiction = components['schemas']['Jurisdiction'];
469
323
  /** Jurisdiction with detail (retrieve response). */
470
324
  export type JurisdictionDetail = components['schemas']['JurisdictionDetailResponse'];
471
- /** Canonical status with office mappings (Phase 2 — manually typed while route is gated). */
472
- export interface Status {
473
- object: 'status_mapping';
474
- office_code: string;
475
- raw_code: string;
476
- status_stage: string;
477
- status_reason: string | null;
478
- challenge_states: string[];
479
- status_source: string;
480
- confidence: number;
481
- notes: string | null;
482
- }
483
325
  /** Event type code. */
484
326
  export type EventType = components['schemas']['EventTypeMapping'];
485
- /** Portfolio (retrieve response). */
327
+ /**
328
+ * One office status code (`GET /v1/status-codes`): the office's verbatim
329
+ * `raw.code` and `raw.label` (null when we hold no verbatim office label for
330
+ * the code, for example USPTO codes today) and the normalised
331
+ * `primary`/`stage`/`reason` Signa maps it to. Decode a trademark's
332
+ * `status.raw.code` with it.
333
+ */
334
+ export type StatusCode = components['schemas']['StatusCode'];
335
+ /** Query params for `references.eventTypes()`. */
336
+ export interface EventTypeListParams {
337
+ /** Office code (WIPO ST.3, e.g. `US`, `EM`). Omit for every office. */
338
+ office_code?: string;
339
+ /** Page size (1-500, default 100). */
340
+ limit?: number;
341
+ cursor?: string;
342
+ }
343
+ /** Query params for `references.statusCodes()`. */
344
+ export interface StatusCodeListParams {
345
+ /** Office code (WIPO ST.3, e.g. `US`, `EM`). Omit for every office. */
346
+ office_code?: string;
347
+ /** Page size (1-500, default 100). */
348
+ limit?: number;
349
+ cursor?: string;
350
+ }
351
+ /**
352
+ * One membership row of a portfolio: the trademark summary the rest of the API
353
+ * returns ({@link TrademarkSummary}), plus the three fields that describe the
354
+ * MEMBERSHIP rather than the mark — `added_at`, `added_by` (`key_*`, or `null`
355
+ * when it predates attribution) and `external_ref` (your own docketing
356
+ * reference for THIS membership, `null` when none is bound; the same mark in
357
+ * two portfolios can carry two different references, or none).
358
+ *
359
+ * Generated, not hand-written: the API publishes `PortfolioMark` as a
360
+ * component, so the two shapes cannot drift.
361
+ */
362
+ export type PortfolioMark = components['schemas']['PortfolioMark'];
363
+ /** The embedded membership page returned by `portfolios.retrieve()`. */
364
+ export type PortfolioMarkList = components['schemas']['PortfolioMarkList'];
365
+ /**
366
+ * A portfolio as it appears in the rows of `portfolios.list()` — the fields
367
+ * every representation shares, and nothing else.
368
+ *
369
+ * The three single-object responses each carry strictly more, so they have
370
+ * their own types: `create()` / `update()` return {@link PortfolioResponse}
371
+ * (adds the top-level `request_id` every single-object response echoes), and
372
+ * `retrieve()` returns {@link PortfolioDetail} (adds the embedded membership
373
+ * page on top of that). List ROWS carry neither: `request_id` sits once on the
374
+ * list envelope, and the embedded page is a detail-only projection.
375
+ */
486
376
  export interface Portfolio {
487
377
  id: string;
488
378
  object: 'portfolio';
489
379
  name: string;
490
380
  description: string | null;
491
- mark_count: number;
492
- metadata: Record<string, string> | null;
381
+ trademark_count: number;
382
+ /**
383
+ * Always an object, never `null` — an unset `metadata` is `{}`. The column is
384
+ * `NOT NULL DEFAULT '{}'`, every read path coerces, and both write paths type
385
+ * the field as a record, so no request can store a null here.
386
+ */
387
+ metadata: Record<string, string>;
493
388
  created_at: string;
494
389
  updated_at: string;
495
390
  }
496
- /** Saved search (retrieve response). */
497
- export interface SavedSearch {
498
- id: string;
499
- object: 'saved_search';
500
- name: string;
501
- description: string | null;
502
- query: Record<string, unknown>;
503
- last_executed_at: string | null;
504
- result_count: number | null;
505
- metadata: Record<string, string> | null;
506
- created_at: string;
507
- updated_at: string;
391
+ /**
392
+ * Portfolio as returned by `portfolios.create()` and `portfolios.update()`:
393
+ * the shared {@link Portfolio} fields plus the `request_id` of the call that
394
+ * produced it. No embedded marks — only `retrieve()` projects those.
395
+ */
396
+ export interface PortfolioResponse extends Portfolio {
397
+ /** Per-request id echoed at the top level of every single-object response. */
398
+ request_id: string;
399
+ }
400
+ /**
401
+ * Portfolio as returned by `portfolios.retrieve()`, with its membership page
402
+ * embedded.
403
+ *
404
+ * `trademarks` is ALWAYS present, including for `limit: 0` (where `data` is
405
+ * empty and `has_more` reports whether the portfolio holds anything at all)
406
+ * and for a `?external_ref=` filter that matches nothing — so it is required,
407
+ * not optional. See {@link PortfolioRetrieveParams}.
408
+ *
409
+ * Generated, not hand-written: the retrieve 200 publishes the `PortfolioDetail`
410
+ * component (`Portfolio` + `trademarks`), so the two shapes cannot drift.
411
+ */
412
+ export type PortfolioDetail = components['schemas']['PortfolioDetail'];
413
+ /**
414
+ * Receipt returned by `portfolios.addTrademarks()`. Counts are over the
415
+ * DISTINCT input marks; on any `409` the whole batch is rolled back and no
416
+ * receipt is returned at all.
417
+ */
418
+ export interface PortfolioMarksAddResult {
419
+ object: 'portfolio_marks_result';
420
+ /** Memberships created by this call. */
421
+ added: number;
422
+ /** Marks that were already members (no-ops), including repeated ids. */
423
+ already_in_portfolio: number;
424
+ /** Ids that resolved to no trademark. Lenient: they do not fail the batch. */
425
+ not_found: number;
426
+ request_id: string;
427
+ }
428
+ /**
429
+ * Receipt returned by `portfolios.removeTrademarks()`. Entries that match no
430
+ * membership are simply skipped, so `removed` can be lower than the number of
431
+ * entries sent — and `0` is a success, not an error.
432
+ */
433
+ export interface PortfolioMarksRemoveResult {
434
+ object: 'portfolio_marks_result';
435
+ /** Memberships actually deleted by this call. */
436
+ removed: number;
437
+ request_id: string;
508
438
  }
509
439
  /** One of the five watch types (VAL-PRODUCT-001). */
510
440
  export type WatchType = 'mark' | 'portfolio' | 'owner' | 'class' | 'similarity';
@@ -610,12 +540,48 @@ export type AlertEventType = 'trademark.created' | 'trademark.updated' | 'tradem
610
540
  export type AlertSeverity = 'normal' | 'high' | 'critical';
611
541
  /** Opposition-window state for the matched mark, when applicable. */
612
542
  export type OppositionWindowStatus = 'open' | 'closing_soon' | 'critical' | 'closed';
543
+ /**
544
+ * What a holiday calendar did to a served date. `moved` / `unchanged`: a
545
+ * calendar was consulted. `not_checked`: no pinned closure list verified the
546
+ * date, so the true date can only be the same or LATER (correct-or-EARLY; do
547
+ * not diarise as final). `month_end_overflow`: the period's end day does not
548
+ * exist in the target month and was clamped.
549
+ */
550
+ export type HolidayAdjustment = 'moved' | 'unchanged' | 'not_checked' | 'month_end_overflow';
613
551
  /**
614
552
  * One entry in an alert's `event.diff`. Parent-field changes carry real
615
553
  * `from`/`to` values; child-entity changes are opaque (`{ path, op:'changed' }`,
616
554
  * `from`/`to` absent).
617
555
  */
618
556
  export interface AlertDiffEntry {
557
+ /**
558
+ * PUBLIC trademark field name — the same vocabulary `changed_fields` and
559
+ * `changes` use on `trademark.status_changed`, and the same names you read
560
+ * back from `trademarks.retrieve()`: `status`, `mark_text`,
561
+ * `publication_date`, `ir_number`, or a changed child collection (`owners`,
562
+ * `attorneys`, `classifications`, `media`, …).
563
+ *
564
+ * Status is FLATTENED: the resource nests status under an object, this list
565
+ * is flat, so `status.primary` is `status` and the rest are `status_<key>`
566
+ * (`status_stage`, `status_reason`, `status_challenges`,
567
+ * `status_effective_date`, `status_basis`, `status_raw_code`,
568
+ * `status_raw_label`).
569
+ *
570
+ * 0.14.0: REST alerts and `alert.created` payload v2 follow the new trademark
571
+ * row: `office_record_id` (was `source_primary_id`), `status_basis` (was
572
+ * `status_source`), no `*_date_basis` entries, and office-stated values only
573
+ * for `expiry_date` / `renewal_due_date`. A v1 `alert.created` delivery keeps
574
+ * the v1 names.
575
+ *
576
+ * Fields Signa tracks internally but does not publish never appear — they
577
+ * are dropped rather than renamed, so every `path` is resolvable against the
578
+ * trademark resource and a diff can be shorter than the raw change was.
579
+ *
580
+ * BETA BREAK: this used to carry internal column tokens
581
+ * (`status_primary`, `mark_text_primary`, `trademark_owners`, …). Redelivered
582
+ * and retried deliveries of older alerts are re-emitted with the public
583
+ * names, so only one vocabulary ever reaches your handler.
584
+ */
619
585
  path: string;
620
586
  op: 'set' | 'unset' | 'changed';
621
587
  from?: unknown;
@@ -696,7 +662,12 @@ export interface Alert {
696
662
  customer_reference: string | null;
697
663
  event: {
698
664
  type: AlertEventType;
699
- /** Short human-readable description, e.g. `"Status primary changed: pending → registered"`. */
665
+ /**
666
+ * Short human-readable description, e.g.
667
+ * `"Status changed: pending → registered"`. Composed from the same PUBLIC
668
+ * field names as {@link AlertDiffEntry.path}, so the headline and the
669
+ * structured diff always agree.
670
+ */
700
671
  summary: string;
701
672
  diff: AlertDiffEntry[];
702
673
  /**
@@ -715,6 +686,13 @@ export interface Alert {
715
686
  opposition_window_status: OppositionWindowStatus | null;
716
687
  /** Computed customer-action deadline; null if no deadline applies. */
717
688
  must_act_by: string | null;
689
+ /**
690
+ * Whether a holiday calendar stood behind `must_act_by` when it was frozen
691
+ * onto this alert. `null` on alerts emitted before this field existed and
692
+ * on alerts with no opposition window: read it as "no marker was
693
+ * recorded", never as "verified".
694
+ */
695
+ must_act_by_adjustment: HolidayAdjustment | null;
718
696
  };
719
697
  /**
720
698
  * True when this alert was generated well after the underlying change
@@ -747,8 +725,24 @@ export interface Alert {
747
725
  */
748
726
  provenance: AlertProvenance;
749
727
  }
750
- /** Webhook event types delivered by the dispatcher. */
751
- export type WebhookEventType = 'alert.created' | 'webhook.test';
728
+ /**
729
+ * Webhook event types delivered by the dispatcher.
730
+ *
731
+ * The first three are the STATIC subscribable set for `enabled_events` — the
732
+ * API accepts them at all times, independently of our rollout state. Source of
733
+ * truth: `WEBHOOK_SUBSCRIBABLE_EVENT_TYPES` in `@signa/types`, pinned by
734
+ * `packages/types/src/api-events.test.ts` (a source-text pin, because the
735
+ * published SDK must not depend on `@signa/types` at runtime).
736
+ *
737
+ * `trademark.status_changed` and `office_action.issued` are accepted for
738
+ * subscription but are NOT YET EMITTED: they begin delivering when the API
739
+ * events projector is enabled. Subscribing early is safe and means you receive
740
+ * them from the first delivery.
741
+ *
742
+ * `webhook.test` is the shape delivered by `webhooks.test()` only; it is not a
743
+ * subscribable type and `enabled_events` rejects it.
744
+ */
745
+ export type WebhookEventType = 'alert.created' | 'trademark.status_changed' | 'office_action.issued' | 'webhook.test';
752
746
  /**
753
747
  * What arrives at a customer webhook endpoint, in the body of the POST
754
748
  * (Round 4 R4.5 — TSK-111 monitoring v1).
@@ -758,7 +752,7 @@ export type WebhookEventType = 'alert.created' | 'webhook.test';
758
752
  * (`standardwebhooks` on npm, `svix-webhooks` for Python, etc.) before
759
753
  * trusting `data`.
760
754
  *
761
- * `id` is a prefixed public ID (e.g. `alt_<uuid>` for `alert.created`) — the
755
+ * `id` is a prefixed event ID (`evt_*`) — the
762
756
  * same value as the `webhook-id` header. `timestamp` is an ISO 8601 UTC
763
757
  * instant captured at signing. `data` is the event-specific payload
764
758
  * (see {@link AlertCreatedPayload}).
@@ -767,17 +761,17 @@ export interface WebhookEvent<T = unknown> {
767
761
  type: WebhookEventType;
768
762
  /** Prefixed event ID — matches the `webhook-id` header. */
769
763
  id: string;
764
+ /** Version of the public event payload contract carried in `data`. */
765
+ payload_version?: number;
770
766
  /** ISO 8601 UTC timestamp. */
771
767
  timestamp: string;
772
768
  data: T;
773
769
  }
774
770
  /**
775
- * Preserved FLAT fields on an `alert.created` webhook delivery.
771
+ * Alert fields nested under `data.alert` on an `alert.created` delivery.
776
772
  *
777
- * These are the lean, backward-compatible top-level fields the dispatcher has
778
- * always emitted. They are kept alongside the rich {@link Alert} object (see
779
- * {@link AlertCreatedPayload}) so existing consumers that read flat fields
780
- * never break.
773
+ * Phase 3 intentionally moved these fields beneath `data.alert`; consumers of
774
+ * the beta flat envelope must update to the nested shape.
781
775
  *
782
776
  * IDs are prefixed (Round 4 R4.5) — `alert_id`, `watch_id`, and
783
777
  * `trademark_record_id` feed straight into `GET /v1/alerts/{id}` etc.
@@ -786,6 +780,9 @@ export interface WebhookEvent<T = unknown> {
786
780
  * Note the absence of `org_id`: the dispatcher omits it because the
787
781
  * customer's webhook endpoint already implies the tenant, and
788
782
  * cross-referencing internal tenant UUIDs is not part of the public API.
783
+ *
784
+ * @deprecated The flat alert fields were removed from the webhook contract.
785
+ * Use {@link AlertCreatedData.alert}, the rich alert resource.
789
786
  */
790
787
  export interface AlertCreatedFlatFields {
791
788
  /** Prefixed alert ID, e.g. `alt_018f...`. */
@@ -820,31 +817,205 @@ export interface AlertCreatedFlatFields {
820
817
  source_data_hash: string | null;
821
818
  }
822
819
  /**
823
- * Inner payload of an `alert.created` webhook delivery.
820
+ * Self-contained alert resource nested at `data.alert`.
824
821
  *
825
822
  * The dispatcher (`buildSelfContainedAlertData` in
826
823
  * `workers/webhook-dispatcher/src/dispatcher.ts`) emits a SELF-CONTAINED body:
827
824
  * the full rich {@link Alert} object (`watch`, `event`, `match`, `trademark`,
828
825
  * `deadline`, `timestamps`, `schema_version`, `customer_reference`, `links`,
829
- * `id`, `object`) SPREAD together with the preserved {@link AlertCreatedFlatFields}.
830
- * Rich-first, flat-last, so the lean flat fields win on any future key overlap.
831
- *
832
- * The flat fields ({@link AlertCreatedFlatFields}) are ALWAYS present. The rich
833
- * half mirrors the REST {@link Alert} resource MINUS `evaluation_epoch`
834
- * (REST-only — the webhook carries the epoch as a flat field instead, see
835
- * {@link AlertCreatedFlatFields.evaluation_epoch}), and is OPTIONAL: the rich
836
- * fields (`event`, `trademark`, `match`, `watch`, `deadline`, `timestamps`,
837
- * `schema_version`, `links`, `id`, `object`, `customer_reference`) are present
838
- * on normal deliveries but ABSENT on the rare lean-fallback delivery — when the
839
- * alert row was hard-deleted between emit and dispatch, hydration returns null
840
- * and the dispatcher emits ONLY the flat fields.
826
+ * `id`, `object`).
841
827
  *
842
- * Consumers that read rich fields should feature-detect, e.g.
843
- * `if (data.event) { … }`, rather than assume they are present.
828
+ * The rich object mirrors the REST {@link Alert} resource minus
829
+ * `evaluation_epoch` and `provenance`; the event builder DLQs when it cannot
830
+ * hydrate that complete resource.
844
831
  */
845
- export type AlertCreatedPayload = AlertCreatedFlatFields & Partial<Omit<Alert, 'evaluation_epoch' | 'provenance'>>;
832
+ export type AlertCreatedPayload = Omit<Alert, 'evaluation_epoch' | 'provenance'>;
846
833
  /** Webhook envelope for an `alert.created` delivery. */
847
- export type AlertCreatedEvent = WebhookEvent<AlertCreatedPayload>;
834
+ export interface AlertCreatedData {
835
+ /** Stable spine event ID; identical to the envelope id and webhook-id header. */
836
+ event_id: string;
837
+ /** Prefixed alert resource ID. */
838
+ alert_id: string;
839
+ /** Self-contained alert payload. */
840
+ alert: AlertCreatedPayload;
841
+ }
842
+ export type AlertCreatedEvent = Omit<WebhookEvent<AlertCreatedData>, 'type' | 'payload_version'> & {
843
+ type: 'alert.created';
844
+ payload_version: number;
845
+ };
846
+ /**
847
+ * A portfolio this mark belonged to when the event was recorded (ENG-344
848
+ * follow-up A3), with the `external_ref` you set on the membership.
849
+ *
850
+ * FROZEN at record time. Editing the membership or its reference afterwards
851
+ * never rewrites an event you already received, which is what keeps a
852
+ * redelivery byte-identical to the original. `external_ref` is `null` when the
853
+ * membership carries none, or when the event predates the snapshot column —
854
+ * read it as "unknown or unset", never as "cleared".
855
+ */
856
+ export interface EventPortfolioRef {
857
+ /** Prefixed portfolio ID (`ptf_*`). */
858
+ id: string;
859
+ external_ref: string | null;
860
+ }
861
+ /**
862
+ * `trademark.status_changed` data. v1 and v2 share every key; they differ in
863
+ * the change vocabulary of `changed_fields` / `changes` (see
864
+ * {@link TrademarkStatusChangedData.changed_fields}). Read the envelope's
865
+ * `payload_version` to tell them apart.
866
+ */
867
+ export interface TrademarkStatusChangedData {
868
+ event_id: string;
869
+ trademark_id: string;
870
+ office_code: string | null;
871
+ jurisdiction_code: string;
872
+ version: number;
873
+ mark_text: string | null;
874
+ status: string | null;
875
+ status_stage: string;
876
+ status_reason: string | null;
877
+ owner_name: string | null;
878
+ /**
879
+ * PUBLIC field names of the trademark resource that changed — never Signa's
880
+ * internal column names. `status_primary` reads as `status`,
881
+ * `mark_text_primary` as `mark_text`, `publication_date_first` as
882
+ * `publication_date`, `international_registration_number` as `ir_number`,
883
+ * `challenge_states` as `status_challenges`; a changed child collection reads
884
+ * as its resource name (`owners`, `classifications`, `media`, ...). Columns
885
+ * Signa tracks but does not publish are OMITTED rather than renamed, so this
886
+ * list can be shorter than the number of columns that moved.
887
+ *
888
+ * `payload_version` 2 follows the 0.14.0 trademark row: `office_record_id`
889
+ * (v1 `source_primary_id`) and `status_basis` (v1 `status_source`, values in
890
+ * the `status.basis` vocabulary: `office`, `event_derived`,
891
+ * `dispatch_derived`, `computed`); `expiry_date_basis` and
892
+ * `renewal_due_date_basis` are never listed. In v2 `expiry_date` and
893
+ * `renewal_due_date` carry office-stated values only (a side Signa computed
894
+ * is `null`, and a change between two computed values is omitted),
895
+ * `status_raw_label` follows the verbatim-label rule, `registration_number`
896
+ * has no `WO` prefix and `office_record_id` is `null` for a Madrid key Signa
897
+ * composed.
898
+ */
899
+ changed_fields: string[];
900
+ /** Field-level diff keyed by the same public names as `changed_fields`. */
901
+ changes: Record<string, {
902
+ before: unknown;
903
+ after: unknown;
904
+ }>;
905
+ /**
906
+ * When SIGNA produced this event (ISO-8601) — the moment ingestion stored the
907
+ * change, NOT the moment the office published it. The two differ by the
908
+ * office publication lag (1 to 14 days), so a docket sorted only on
909
+ * `occurred_at` is wrong by that lag. Use {@link source_date} for the
910
+ * office's own date.
911
+ */
912
+ occurred_at: string;
913
+ /**
914
+ * The office-reported DATA DATE of the change as stored by Signa
915
+ * (`YYYY-MM-DD`), or `null` when the feed reports none.
916
+ *
917
+ * Day precision, and what it means varies by office: USPTO transaction date,
918
+ * WIPO gazette date, snapshot offices the crawl date. It is NOT a legal
919
+ * effective date — look in `changes.status_effective_date` for that. Sorting
920
+ * a docket by `source_date` is meaningful WITHIN ONE OFFICE; across offices
921
+ * you are comparing different kinds of date.
922
+ */
923
+ source_date: string | null;
924
+ /**
925
+ * Portfolios this mark was in when the event was recorded. Empty when it was
926
+ * in none. See {@link EventPortfolioRef}.
927
+ *
928
+ * OPTIONAL because deliveries persisted before this release do not carry it:
929
+ * `/redeliver` and retry attempts 2..7 replay the stored payload verbatim, so
930
+ * an event first delivered before the field shipped stays without it forever.
931
+ * Treat `undefined` as "this delivery predates the field", not as "empty".
932
+ */
933
+ portfolios?: EventPortfolioRef[];
934
+ }
935
+ export type TrademarkStatusChangedEvent = Omit<WebhookEvent<TrademarkStatusChangedData>, 'type' | 'payload_version'> & {
936
+ type: 'trademark.status_changed';
937
+ payload_version: number;
938
+ };
939
+ /**
940
+ * `office_action.issued` data at `payload_version` 1: the prosecution row's
941
+ * fields flattened beside the identity fields.
942
+ */
943
+ export interface OfficeActionIssuedDataV1 {
944
+ /** Stable event ID; identical to the envelope id and the webhook-id header. */
945
+ event_id: string;
946
+ trademark_id: string;
947
+ office_code: string | null;
948
+ event_date: string;
949
+ event_code: string | null;
950
+ event_label: string | null;
951
+ scope: string | null;
952
+ status_after_event: string | null;
953
+ nice_class_number: number | null;
954
+ description: string | null;
955
+ source_identifier: string | null;
956
+ sequence_no: number | null;
957
+ jurisdiction_code: string | null;
958
+ /**
959
+ * When SIGNA produced this event (ISO-8601) — the moment ingestion stored the
960
+ * office-action row, not the moment the office issued it. Use
961
+ * {@link source_date} (or the equal {@link event_date}) for the office's date.
962
+ */
963
+ occurred_at: string;
964
+ /**
965
+ * The office-reported data date this action is from (`YYYY-MM-DD`) — the same
966
+ * value as `event_date`, restated under the name every event family shares so
967
+ * a mixed feed sorts by office date without branching on `type`.
968
+ */
969
+ source_date: string | null;
970
+ /**
971
+ * Portfolios this mark was in when the event was recorded. Empty when it was
972
+ * in none. See {@link EventPortfolioRef}.
973
+ *
974
+ * OPTIONAL because deliveries persisted before this release do not carry it —
975
+ * see {@link TrademarkStatusChangedData.portfolios}.
976
+ */
977
+ portfolios?: EventPortfolioRef[];
978
+ }
979
+ /**
980
+ * `office_action.issued` data at `payload_version` 2: the identity fields and
981
+ * the prosecution row itself as `trademark_event`, the same object
982
+ * `trademarks.events()` returns (`hst_` id, `raw {code, label}`,
983
+ * `nice_class`, `sequence_number`).
984
+ */
985
+ export interface OfficeActionIssuedDataV2 {
986
+ /** Stable event ID; identical to the envelope id and the webhook-id header. */
987
+ event_id: string;
988
+ trademark_id: string;
989
+ office_code: string | null;
990
+ /** Designation jurisdiction (two letters); null for mark-level actions. */
991
+ jurisdiction_code: string | null;
992
+ /** When SIGNA produced this event (ISO-8601), never the office's date. */
993
+ occurred_at: string;
994
+ /** The office's date for the action (`YYYY-MM-DD`), equal to `trademark_event.event_date`. */
995
+ source_date: string | null;
996
+ trademark_event: TrademarkEvent;
997
+ /** Portfolios this mark was in when the event was recorded. See {@link EventPortfolioRef}. */
998
+ portfolios: EventPortfolioRef[];
999
+ }
1000
+ /** `office_action.issued` data, either version. Narrow on the envelope's `payload_version`. */
1001
+ export type OfficeActionIssuedData = OfficeActionIssuedDataV1 | OfficeActionIssuedDataV2;
1002
+ /**
1003
+ * An `office_action.issued` delivery. Every event keeps the version it was
1004
+ * stored with: automatic retries, `/redeliver` and `GET /v1/events/{id}` of a
1005
+ * v1 event stay v1, so handle both.
1006
+ *
1007
+ * ```typescript
1008
+ * if (event.payload_version === 2) handleRow(event.data.trademark_event);
1009
+ * else handleLegacy(event.data.event_code, event.data.sequence_no);
1010
+ * ```
1011
+ */
1012
+ export type OfficeActionIssuedEvent = (Omit<WebhookEvent<OfficeActionIssuedDataV1>, 'type' | 'payload_version'> & {
1013
+ type: 'office_action.issued';
1014
+ payload_version: 1;
1015
+ }) | (Omit<WebhookEvent<OfficeActionIssuedDataV2>, 'type' | 'payload_version'> & {
1016
+ type: 'office_action.issued';
1017
+ payload_version: 2;
1018
+ });
848
1019
  /** Webhook endpoint status. */
849
1020
  export type WebhookStatus = 'active' | 'disabled';
850
1021
  /**
@@ -869,6 +1040,13 @@ export interface Webhook {
869
1040
  url: string;
870
1041
  description: string | null;
871
1042
  enabled_events: WebhookEventType[] | string[];
1043
+ /**
1044
+ * Optional portfolio scope (`ptf_*`). Applies to EVERY event type,
1045
+ * `alert.created` included: the endpoint receives an event only when its mark
1046
+ * was a member of this portfolio at the time the event was recorded. Null =
1047
+ * no scope; the endpoint receives everything it is subscribed to.
1048
+ */
1049
+ portfolio_id: string | null;
872
1050
  status: WebhookStatus;
873
1051
  secret_version: number;
874
1052
  consecutive_failures: number;
@@ -930,13 +1108,23 @@ export interface WatchPreviewResponse {
930
1108
  estimated_match_count: number;
931
1109
  trial_window_days: number;
932
1110
  /**
933
- * Present ONLY when `estimated_match_count` is an upper-bound estimate
934
- * rather than an exact count. One value, three triggers: the candidacy
935
- * scan overflowed the server-side cap, search was temporarily
936
- * unreachable, or the server-side time budget expired after candidates
937
- * were found (partial result). Absent = exact count.
1111
+ * Present ONLY when `estimated_match_count` is not an exact count.
1112
+ * `query_upper_bound`: the time budget ran out after the search but before
1113
+ * the change check; the count is the marks that matched `q` in the window,
1114
+ * so it can only be too high. `lower_bound`: the search timed out or lost a
1115
+ * shard, more than 10,000 marks matched `q` in the window, or the change
1116
+ * check timed out; the count is the verified matches (0 if none), so it can
1117
+ * only be too low. `candidacy_upper_bound`: a watch without a text query
1118
+ * could not be fully evaluated; the count is the changed marks in the
1119
+ * window. Absent = exact count.
1120
+ */
1121
+ estimate_basis?: 'candidacy_upper_bound' | 'query_upper_bound' | 'lower_bound';
1122
+ /**
1123
+ * True when the preview did not finish: the time budget ran out, the search
1124
+ * timed out or lost a shard, or the results page could not be loaded (then
1125
+ * `results` is empty and `has_more` false, but the count stands).
938
1126
  */
939
- estimate_basis?: 'candidacy_upper_bound';
1127
+ partial?: boolean;
940
1128
  /**
941
1129
  * A page of the actual matching trademarks in the canonical summary shape
942
1130
  * (identical to `GET /v1/trademarks` results). Returned BY DEFAULT; omitted
@@ -1020,8 +1208,31 @@ export interface WatchDiagnostics {
1020
1208
  alert_id: string | null;
1021
1209
  opposition: {
1022
1210
  must_act_by: string | null;
1211
+ /**
1212
+ * Stable opaque slug of the opposition rule cited for this mark (e.g.
1213
+ * `us_opposition`), and the join key to `GET /v1/opposition-rules`.
1214
+ * Opaque — do not parse it. Effectively always present when the
1215
+ * `opposition` block is present: an unmodeled office yields a null block
1216
+ * rather than a block with a null `rule_id`. It is still emitted when the
1217
+ * window could not be computed (`rule_source`/`rule_version` null), so a
1218
+ * degraded block stays joinable; that degraded path, with an empty rule
1219
+ * lookup, is the only way this is null.
1220
+ */
1221
+ rule_id: string | null;
1023
1222
  rule_source: string | null;
1024
1223
  rule_version: string | null;
1224
+ /**
1225
+ * The window close recomputed at request time. May legitimately differ
1226
+ * from the frozen `must_act_by` (a later closure notice, a rule
1227
+ * correction, wider calendar coverage).
1228
+ */
1229
+ recomputed_close: string | null;
1230
+ /**
1231
+ * Describes the SERVED date (`must_act_by`): the alert's frozen marker
1232
+ * when it carries one, otherwise `not_checked` when the two dates
1233
+ * disagree, otherwise the recomputed marker.
1234
+ */
1235
+ close_adjustment: HolidayAdjustment | null;
1025
1236
  window_status: WatchDiagnosticsWindowStatus | null;
1026
1237
  } | null;
1027
1238
  data_window: {
@@ -1045,12 +1256,32 @@ export interface WatchAttestationGap {
1045
1256
  through: string;
1046
1257
  /**
1047
1258
  * `office_lagging` = coverage was stale beyond the office SLO for this
1048
- * interval. `evaluation_failed` is reserved (not emitted in v1: gaps cover
1049
- * coverage-staleness only).
1259
+ * interval. `evaluation_missing` = no evaluation ran for the interval at all
1260
+ * although one should have (pause, credit lock, lease starvation, or no
1261
+ * evaluation evidence for longer than the continuity backstop).
1262
+ * `budget_declined` (ENG-286) = a specific office sync run was NOT evaluated
1263
+ * because it exceeded the evaluator's per-run change budget; later coverage
1264
+ * does not close it, only an audited re-drive or a recorded suppression does.
1265
+ * A budget-declined run is reported under `budget_declined` only, never also
1266
+ * as `evaluation_missing`. `evaluation_failed` is reserved (not emitted).
1267
+ */
1268
+ reason: 'office_lagging' | 'evaluation_missing' | 'evaluation_failed' | 'budget_declined';
1269
+ /**
1270
+ * True once coverage caught back up within the period (`office_lagging`),
1271
+ * evaluation demonstrably resumed at the end of the interval
1272
+ * (`evaluation_missing`), or an operator closed the declined run within the
1273
+ * period (`budget_declined`). A resolution AFTER the period is deliberately
1274
+ * invisible, so a closed period's artifact never mutates.
1050
1275
  */
1051
- reason: 'office_lagging' | 'evaluation_failed';
1052
- /** True once coverage caught back up within the period. */
1053
1276
  resolved: boolean;
1277
+ /** Present only on `budget_declined` gaps: the run that was not evaluated. */
1278
+ sync_run_id?: string;
1279
+ /**
1280
+ * Present only on a RESOLVED `budget_declined` gap. `redriven` = the run was
1281
+ * re-evaluated (the changes were eventually assessed); `suppressed` = an
1282
+ * operator recorded that it never will be. Not the same claim.
1283
+ */
1284
+ resolution?: 'redriven' | 'suppressed';
1054
1285
  }
1055
1286
  /**
1056
1287
  * Per-office attestation entry. `status: 'unsupported'` (an in-scope office
@@ -1076,6 +1307,12 @@ export interface WatchAttestationOffice {
1076
1307
  coverage_through?: string | null;
1077
1308
  coverage_basis?: 'source_dates' | 'date_range' | 'run_completed' | null;
1078
1309
  gaps?: WatchAttestationGap[];
1310
+ /**
1311
+ * Every supported office (`no_evaluations` and `evaluated` alike): evaluation
1312
+ * resumed AFTER the period. A generation-time fact, excluded from
1313
+ * `content_hash` — the period's own gaps stay permanently unresolved.
1314
+ */
1315
+ evaluation_resumed_after_period?: boolean;
1079
1316
  }
1080
1317
  /**
1081
1318
  * The filable monthly proof-of-monitoring artifact. Deterministic for a closed
@@ -1118,6 +1355,14 @@ export interface WatchAttestation {
1118
1355
  totals: {
1119
1356
  evaluations: number;
1120
1357
  alerts_emitted: number;
1358
+ /**
1359
+ * ENG-286 — office sync runs in the period that were DECLINED without
1360
+ * evaluation (per-run change budget). Each is disclosed as a
1361
+ * `budget_declined` gap on its office.
1362
+ */
1363
+ declined_runs: number;
1364
+ /** Subset of `declined_runs` still outstanding at the end of the period. */
1365
+ declined_runs_unresolved: number;
1121
1366
  };
1122
1367
  reconciliation: 'consistent' | 'mismatch';
1123
1368
  statement: string;
@@ -1155,20 +1400,83 @@ export interface OrgEvent {
1155
1400
  id: string;
1156
1401
  object: 'event';
1157
1402
  type: string;
1158
- trademark_id: string;
1159
- office_code: string;
1403
+ trademark_id: string | null;
1404
+ office_code: string | null;
1405
+ /**
1406
+ * When SIGNA produced this event (ISO-8601). Its meaning is per family:
1407
+ * ingestion time for `trademark.*` and `office_action.*`, alert-creation time
1408
+ * for `alert.created`. It is never the office's own date — the detail bodies
1409
+ * carry that as `source_date`.
1410
+ */
1411
+ occurred_at: string;
1412
+ recorded_at: string;
1160
1413
  created_at: string;
1161
1414
  }
1162
- /** Org-level event detail (with field-level before/after diffs). */
1163
- export interface OrgEventDetail extends OrgEvent {
1415
+ /** Trademark-family event detail (with field-level before/after diffs). */
1416
+ export interface TrademarkOrgEventDetail extends OrgEvent {
1417
+ type: `trademark.${string}`;
1418
+ payload_version: number;
1419
+ trademark_id: string;
1164
1420
  version: number;
1421
+ mark_text: string | null;
1422
+ status: string | null;
1423
+ status_stage: string;
1424
+ status_reason: string | null;
1425
+ owner_name: string | null;
1426
+ jurisdiction_code: string;
1427
+ /**
1428
+ * PUBLIC trademark-resource field names that changed — same vocabulary as
1429
+ * the `trademark.status_changed` webhook body (see
1430
+ * {@link TrademarkStatusChangedData.changed_fields}). Fields Signa tracks but
1431
+ * does not publish are omitted rather than renamed.
1432
+ */
1165
1433
  changed_fields: string[];
1434
+ /** Field-level diff keyed by the same public names as `changed_fields`. */
1166
1435
  changes: Record<string, {
1167
1436
  before: unknown;
1168
1437
  after: unknown;
1169
1438
  }>;
1439
+ /** Office-reported data date, day precision. See {@link TrademarkStatusChangedData.source_date}. */
1440
+ source_date?: string | null;
1441
+ /** Frozen membership snapshot. See {@link EventPortfolioRef}. */
1442
+ portfolios?: EventPortfolioRef[];
1170
1443
  request_id: string;
1171
1444
  }
1445
+ /** Alert-family event detail. Family-specific trademark fields are absent. */
1446
+ export interface AlertCreatedOrgEventDetail {
1447
+ id: string;
1448
+ object: 'event';
1449
+ type: 'alert.created';
1450
+ payload_version: number;
1451
+ alert_id: string;
1452
+ alert: Record<string, unknown>;
1453
+ office_code: null;
1454
+ occurred_at: string;
1455
+ recorded_at: string;
1456
+ created_at: string;
1457
+ request_id: string;
1458
+ }
1459
+ /**
1460
+ * Office-action event detail returned by the org event feed, in the version the
1461
+ * event was stored with: v1 flat fields, or v2 `trademark_event`.
1462
+ */
1463
+ export type OfficeActionIssuedOrgEventDetail = OrgEvent & {
1464
+ type: 'office_action.issued';
1465
+ trademark_id: string;
1466
+ jurisdiction_code: string | null;
1467
+ /** Office-reported data date. See {@link OfficeActionIssuedDataV1.source_date}. */
1468
+ source_date?: string | null;
1469
+ /** Frozen membership snapshot. See {@link EventPortfolioRef}. */
1470
+ portfolios?: EventPortfolioRef[];
1471
+ request_id: string;
1472
+ } & (({
1473
+ payload_version: 1;
1474
+ } & Omit<OfficeActionIssuedDataV1, 'event_id' | 'trademark_id' | 'office_code' | 'jurisdiction_code' | 'occurred_at' | 'source_date' | 'portfolios'>) | {
1475
+ payload_version: 2;
1476
+ trademark_event: TrademarkEvent;
1477
+ });
1478
+ /** Org-level event detail, discriminated by event family. */
1479
+ export type OrgEventDetail = TrademarkOrgEventDetail | OfficeActionIssuedOrgEventDetail | AlertCreatedOrgEventDetail;
1172
1480
  /** Identity (GET /v1/organization/me). */
1173
1481
  export type Identity = components['schemas']['Identity'];
1174
1482
  /** Usage (GET /v1/organization/usage). */
@@ -1193,6 +1501,18 @@ export type UsageSummaryResponse = components['schemas']['UsageSummaryResponse']
1193
1501
  export type UsageSummaryItem = components['schemas']['UsageSummaryItem'];
1194
1502
  /** Billing period context on a usage summary response. */
1195
1503
  export type UsageBillingPeriod = components['schemas']['BillingPeriodContext'];
1504
+ /** Usage estimate response (GET /v1/organization/usage/estimate). */
1505
+ export type UsageEstimate = components['schemas']['UsageEstimate'];
1506
+ /** Per-action row of `UsageEstimate.by_action`. */
1507
+ export type UsageEstimateAction = components['schemas']['UsageEstimateAction'];
1508
+ /** Route the credit schedule does not recognize (`UsageEstimate.unmapped`). */
1509
+ export type UsageEstimateUnmapped = components['schemas']['UsageEstimateUnmapped'];
1510
+ /** Plan the estimated traffic lands on (`UsageEstimate.plan_for`). */
1511
+ export type UsageEstimatePlan = components['schemas']['UsageEstimatePlan'];
1512
+ /** Beta thank-you discount on that plan (`UsageEstimate.offer`). */
1513
+ export type UsageEstimateOffer = components['schemas']['UsageEstimateOffer'];
1514
+ /** Extra credits the landing plan needs: one whole-dollar purchase at the plan rate (`UsageEstimate.packs_needed`). */
1515
+ export type UsageEstimatePacks = components['schemas']['UsageEstimatePacks'];
1196
1516
  /** Pooled credit balance response (GET /v1/organization/credits). */
1197
1517
  export type CreditBalance = components['schemas']['CreditBalanceResponse'];
1198
1518
  /** Remaining-credit breakdown by grant type on a credit balance response. */
@@ -1226,27 +1546,6 @@ export interface TrademarkDocument {
1226
1546
  }
1227
1547
  /** Owner related entity (GLEIF corporate hierarchy). */
1228
1548
  export type OwnerRelated = components['schemas']['OwnerRelated'];
1229
- /**
1230
- * A `search_meta.warnings[]` element (mirror of the API spec). Two families
1231
- * share this shape:
1232
- * • strategy-skip warnings — a REQUESTED strategy produced zero clauses for
1233
- * the query shape (e.g. `strategies=[phonetic]` on a query too short or
1234
- * high-collision); carries `strategy`.
1235
- * • filter-coverage warnings — an applied filter (e.g. `opposition_status`,
1236
- * `seniority_claims`) has partial index coverage; carries `severity`,
1237
- * `affected_filter`, `affected_offices`, `behavior`.
1238
- */
1239
- export interface SearchWarning {
1240
- code: string;
1241
- message: string;
1242
- strategy?: string;
1243
- severity?: 'info' | 'warning';
1244
- affected_filter?: string;
1245
- /** WIPO ST.3 office codes (e.g. 'US', 'EM', 'WO') affected by the caveat. */
1246
- affected_offices?: string[];
1247
- behavior?: string;
1248
- }
1249
- /** Search metadata (V2 — timing, totals, strategy info). */
1250
1549
  /**
1251
1550
  * ENG-106 — how the query text is matched against the mark text.
1252
1551
  * `similar` (default) runs the ranked strategies ladder (relevance scoring).
@@ -1256,41 +1555,26 @@ export interface SearchWarning {
1256
1555
  * additionally needs a folded query of at least 3 characters.
1257
1556
  */
1258
1557
  export type MatchMode = 'similar' | 'exact' | 'starts_with' | 'ends_with' | 'contains';
1259
- export interface SearchMeta {
1260
- search_id: string;
1261
- query: string | null;
1262
- /** Public strategies used for the served set. Empty `[]` for deterministic match modes. */
1263
- strategies_used: string[];
1264
- /**
1265
- * ENG-106 — the match mode actually applied. Echoed for ALL modes (including
1266
- * `'similar'`).
1267
- */
1268
- match: MatchMode;
1269
- international_registrations: 'grouped' | 'expanded';
1270
- fallback_reason?: string;
1271
- /**
1272
- * The `jurisdictions` matching mode actually applied: `'protection'` (default,
1273
- * regional-membership expansion) or `'direct'` (literal territory legs).
1274
- * Echoed on every response, including when no `jurisdictions` filter is present.
1275
- */
1276
- territory_match: TerritoryMatchMode;
1277
- /**
1278
- * Search warnings. Two families share this array: per-strategy skip warnings
1279
- * (a REQUESTED strategy produced zero clauses for the query shape) and
1280
- * filter-coverage warnings (an applied filter has partial index coverage).
1281
- * Omitted when there is nothing to warn about.
1282
- */
1283
- warnings?: SearchWarning[];
1284
- /**
1285
- * NOTE: the total matching-result count is NOT on `search_meta`. It surfaces
1286
- * as `pagination.total_count` (+ `pagination.total_count_approximate`) when
1287
- * the caller sets `options.include_total = true` — see
1288
- * `SignaList.total_count`. The former `search_meta.total_results` /
1289
- * `total_count_exact` / `total_count_approximate` fields were removed in the
1290
- * ENG-14 beta break.
1291
- */
1292
- execution_time_ms: number;
1293
- }
1558
+ /**
1559
+ * Search metadata on trademark search and list responses.
1560
+ *
1561
+ * 0.14.0: `fallback_reason` is gone; every caveat is a coded entry in
1562
+ * `warnings[]` (e.g. `expanded_fallback` with `affected_filters`, or
1563
+ * `partial_results`). `index_generation` names the index that served the page;
1564
+ * cursors are bound to it, so a cursor from before an index rebuild returns
1565
+ * `400 cursor_invalid` and pagination restarts.
1566
+ *
1567
+ * The total matching-result count is NOT here: it is `pagination.total_count`
1568
+ * (`SignaList.total_count`) when the request sets `include_total`.
1569
+ */
1570
+ export type SearchMeta = NonNullable<components['schemas']['SearchResponseV2']['search_meta']>;
1571
+ /**
1572
+ * A `search_meta.warnings[]` element: a stable `code` plus a human `message`,
1573
+ * and the code's own detail fields (`strategy`, `affected_filter(s)`,
1574
+ * `affected_offices`, `dropped_strategies`, ...). Keep a default branch: new
1575
+ * codes can appear.
1576
+ */
1577
+ export type SearchWarning = NonNullable<SearchMeta['warnings']>[number];
1294
1578
  /** API error body (RFC 9457-inspired). */
1295
1579
  export interface APIErrorBody {
1296
1580
  type: string;
@@ -1308,6 +1592,89 @@ export interface APIErrorBody {
1308
1592
  retryable?: boolean;
1309
1593
  /** Server-suggested seconds to wait before retrying (body-level mirror of the Retry-After header). */
1310
1594
  retry_after?: number;
1595
+ /**
1596
+ * Human-readable remediation for this error — safe to surface to an end
1597
+ * user or an agent as the next step.
1598
+ *
1599
+ * OPTIONAL because the API does not emit it on every response: the server
1600
+ * backfills it from a per-slug map and otherwise sends nothing, so a 4xx
1601
+ * slug outside that map arrives WITHOUT a suggestion (5xx faults always
1602
+ * carry one — they fall back to the feedback-channel hint). Non-JSON
1603
+ * envelopes synthesized by the SDK for WAF/ALB responses never carry one
1604
+ * either. Always narrow before displaying.
1605
+ */
1606
+ suggestion?: string;
1607
+ }
1608
+ /**
1609
+ * `409 external_ref_conflict` (ENG-342) — a portfolio membership's
1610
+ * `external_ref` cannot be bound as requested. Distinct from the generic
1611
+ * `conflict` slug because it is the ONE conflict a docketing integration can
1612
+ * resolve itself. Two causes, one slug:
1613
+ *
1614
+ * - the membership already carries a DIFFERENT non-null reference (references
1615
+ * are immutable once set — remove the mark and add it again to rebind), or
1616
+ * - the reference is already bound to a different mark in that portfolio.
1617
+ *
1618
+ * `detail` names the conflicting reference and may name the conflicting
1619
+ * `tm_*` id. The whole batch is rolled back. Narrow with
1620
+ * {@link isExternalRefConflict}.
1621
+ */
1622
+ export interface ExternalRefConflictErrorBody extends APIErrorBody {
1623
+ type: 'external_ref_conflict';
1624
+ /**
1625
+ * Always present on this slug. The remedy differs per cause, so the text
1626
+ * names both and defers the specifics to `detail` (which says which one
1627
+ * fired and quotes the conflicting reference):
1628
+ *
1629
+ * > External references are unique within a portfolio and immutable once
1630
+ * > set. Choose a different `external_ref`, or remove the trademark from the
1631
+ * > portfolio and add it again to rebind.
1632
+ */
1633
+ suggestion?: string;
1634
+ }
1635
+ /**
1636
+ * Which per-plan resource cap a `resource_quota_exceeded` refers to.
1637
+ *
1638
+ * `managed_marks` (ENG-342) is NOT a row count: it is the number of DISTINCT
1639
+ * trademarks across ALL of the organization's portfolios, so a mark filed in
1640
+ * three portfolios costs one. The others count rows.
1641
+ */
1642
+ export type QuotaScope = 'managed_marks' | 'portfolios' | 'watches';
1643
+ /**
1644
+ * `409 resource_quota_exceeded` — the organization is at a per-plan RESOURCE
1645
+ * cap. Distinct from the `429 quota_exceeded` request counter: retrying does
1646
+ * not help, so `retryable` is `false`.
1647
+ *
1648
+ * Narrow with {@link isResourceQuotaExceeded}; the extras below are what a
1649
+ * client needs to decide how much of the batch to retry with, without parsing
1650
+ * `detail` prose.
1651
+ */
1652
+ export interface ResourceQuotaExceededErrorBody extends APIErrorBody {
1653
+ type: 'resource_quota_exceeded';
1654
+ quota_scope: QuotaScope;
1655
+ /** The plan's cap for this scope. */
1656
+ quota_limit: number;
1657
+ /** How much of the cap is already consumed. */
1658
+ quota_used?: number;
1659
+ /**
1660
+ * How much this request would have ADDED. For `managed_marks` that is the
1661
+ * number of distinct candidate marks not already managed anywhere in the
1662
+ * organization — so re-adding marks you already manage costs nothing and
1663
+ * succeeds even at the cap.
1664
+ */
1665
+ quota_attempted?: number;
1666
+ /**
1667
+ * Always present on this slug, and scope-specific. `managed_marks`
1668
+ * overrides the generic copy (which would read "Delete an existing
1669
+ * managed_mark") with the actual remedy:
1670
+ *
1671
+ * > Remove marks from portfolios or upgrade your plan.
1672
+ *
1673
+ * Other scopes fall back to the generic
1674
+ * "Delete an existing resource or upgrade your plan. See
1675
+ * https://docs.signa.so/api-reference/plans."
1676
+ */
1677
+ suggestion?: string;
1311
1678
  }
1312
1679
  export type TrademarkSearchInclude = 'full_goods_services';
1313
1680
  export type TrademarkDetailInclude = 'office_extensions';
@@ -1345,7 +1712,16 @@ export interface TrademarkRetrieveParams {
1345
1712
  * `GET /v1/trademarks?aggregations=` and `POST /v1/trademarks` `options.aggregations`.
1346
1713
  * Mirrors the server-side `AggregationEnum` and the generated OpenAPI enum.
1347
1714
  */
1348
- export type TrademarkAggregationName = 'status_stage' | 'office_code' | 'jurisdiction_code' | 'nice_classes' | 'filing_year' | 'mark_feature_type' | 'mark_legal_category' | 'filing_route' | 'right_kind' | 'scope_kind' | 'firm_id' | 'attorney_id' | 'owner_country' | 'owner_id' | 'entity_id';
1715
+ export type TrademarkAggregationName = 'status_stage' | 'office_code' | 'jurisdiction_code' | 'nice_classes' | 'filing_year' | 'mark_feature_type' | 'mark_legal_category' | 'filing_route' | 'right_kind' | 'scope_kind' | 'firm_id' | 'attorney_id' | 'owner_country' | 'owner_id' | 'entity_id'
1716
+ /** `{ value }`: distinct owner records (per office) in the result set. */
1717
+ | 'owner_count'
1718
+ /**
1719
+ * `{ value }`: distinct parties across offices (resolved entities; an owner
1720
+ * not resolved yet counts once per office record). Use for crowding.
1721
+ */
1722
+ | 'entity_count';
1723
+ /** How aggregation counts relate to filters (`aggregation_mode`). */
1724
+ export type TrademarkAggregationMode = 'filtered' | 'exclude_own_filter';
1349
1725
  export interface TrademarkListParams {
1350
1726
  /**
1351
1727
  * Coarse status bucket. Accepts a single value or an array to match any of
@@ -1379,10 +1755,17 @@ export interface TrademarkListParams {
1379
1755
  vienna_codes?: string | string[];
1380
1756
  us_design_codes?: string | string[];
1381
1757
  filing_basis?: string | string[];
1382
- us_register_type?: 'principal' | 'supplemental';
1758
+ /**
1759
+ * The office register (`register.type`), case-insensitive: `principal` or
1760
+ * `supplemental` (US), the CIPO register category (CA), ... Replaces
1761
+ * `us_register_type` (0.14.0).
1762
+ */
1763
+ register_type?: string;
1383
1764
  opposition_status?: OppositionStatus;
1384
- opposition_closes_before?: string;
1385
- opposition_closes_after?: string;
1765
+ /** Opposition window closes on or after this date (YYYY-MM-DD). Replaces `opposition_closes_after`. */
1766
+ opposition_closes_gte?: string;
1767
+ /** Opposition window closes on or before this date (YYYY-MM-DD). Replaces `opposition_closes_before`. */
1768
+ opposition_closes_lte?: string;
1386
1769
  seniority_claims?: SeniorityClaims;
1387
1770
  filing_date_gte?: string;
1388
1771
  filing_date_gt?: string;
@@ -1428,6 +1811,15 @@ export interface TrademarkListParams {
1428
1811
  updated_at_gt?: string;
1429
1812
  updated_at_lte?: string;
1430
1813
  updated_at_lt?: string;
1814
+ /**
1815
+ * When the mark family last changed. Grouped view only (a record-grain
1816
+ * request is a 400); pairs with `sort: 'family_updated_at'` for incremental
1817
+ * sync, which pages past 10,000 results on filter-only requests.
1818
+ */
1819
+ family_updated_at_gte?: string;
1820
+ family_updated_at_gt?: string;
1821
+ family_updated_at_lte?: string;
1822
+ family_updated_at_lt?: string;
1431
1823
  owner_id?: string;
1432
1824
  owner_name?: string;
1433
1825
  owner_publicly_traded?: boolean;
@@ -1436,9 +1828,9 @@ export interface TrademarkListParams {
1436
1828
  owner_lei?: string;
1437
1829
  /**
1438
1830
  * PLN-118 — resolved-entity filter (`ent_*`). The GLOBAL-portfolio feature:
1439
- * returns marks across ALL member owners of the entity (every office). Accepts
1440
- * a derived `ent_<owner-uuid>` (a singleton) too. Over the member cap → 422
1441
- * `entity_too_large`.
1831
+ * returns marks across ALL member owners of the entity (every office). An
1832
+ * owner id in entity form (`ent_<owner-uuid>`) matches nothing (0.14.0); use
1833
+ * `owner_id` for a single owner.
1442
1834
  */
1443
1835
  entity_id?: string;
1444
1836
  /**
@@ -1459,6 +1851,8 @@ export interface TrademarkListParams {
1459
1851
  q?: string;
1460
1852
  /** ENG-67 — faceted bucket counts (TMview "Statistics view"). Field names to aggregate. */
1461
1853
  aggregations?: TrademarkAggregationName[];
1854
+ /** `filtered` (default): aggregations respect every filter. `exclude_own_filter`: each aggregation ignores its own filter (drill-down sidebars). */
1855
+ aggregation_mode?: TrademarkAggregationMode;
1462
1856
  /** ENG-67 — when true, return only aggregation counts (no result documents). */
1463
1857
  aggregations_only?: boolean;
1464
1858
  /** Search strategies to apply (e.g. 'exact', 'phonetic', 'fuzzy', 'prefix'). */
@@ -1474,6 +1868,17 @@ export interface TrademarkListParams {
1474
1868
  match?: MatchMode;
1475
1869
  /** ENG-106 — exclude marks whose text contains this substring (case/accent-insensitive). Composable with any match mode. */
1476
1870
  mark_text_not_contains?: string;
1871
+ /**
1872
+ * Several exact terms in ONE request: every mark that is an exact match
1873
+ * under `match: 'exact'` rules (case, accents, punctuation and spacing) for
1874
+ * ANY of the terms. 1-200 terms. Implies
1875
+ * `match: 'exact'` and replaces `q`; each hit carries `matched_terms[]`.
1876
+ * One page costs the same as any search page regardless of term count.
1877
+ *
1878
+ * `list()` sends the terms comma-joined, so it rejects an empty array and
1879
+ * any term containing a comma. Use `search()` (POST) for such terms.
1880
+ */
1881
+ q_any?: string[];
1477
1882
  /** When true, include total_count in pagination (adds latency). */
1478
1883
  include_total?: boolean;
1479
1884
  /** When true, include match highlight spans. */
@@ -1486,7 +1891,8 @@ export interface TrademarkListParams {
1486
1891
  fields?: string[];
1487
1892
  goods_services_text?: string;
1488
1893
  origin_office_code?: string;
1489
- renewal_due_before?: string;
1894
+ /** Firm of record on the attorney rows (the name the office recorded). */
1895
+ attorney_firm_name?: string;
1490
1896
  /**
1491
1897
  * Sort spec. Prefix with `-` for descending. Comma-separated for multi-field.
1492
1898
  * E.g. `-filing_date`, `registration_date`, `-filing_date,office_code`.
@@ -1514,6 +1920,8 @@ export interface TrademarkSuggestParams {
1514
1920
  status_stage?: string | string[];
1515
1921
  }
1516
1922
  export interface TrademarkProceedingsParams {
1923
+ /** Only proceedings where this mark is the `contested` or was `asserted` by the opposer / petitioner. */
1924
+ trademark_role?: 'contested' | 'asserted';
1517
1925
  proceeding_type?: string;
1518
1926
  status?: string;
1519
1927
  limit?: number;
@@ -1533,6 +1941,19 @@ export interface TrademarkDocumentParams {
1533
1941
  limit?: number;
1534
1942
  cursor?: string;
1535
1943
  }
1944
+ /**
1945
+ * Query params for BOTH trademark citation sub-resources
1946
+ * (`trademarks.citations()` and `trademarks.citedBy()`). Sort is fixed
1947
+ * `-action_date, id` server-side — there is no `sort` param.
1948
+ */
1949
+ export interface TrademarkCitationsParams {
1950
+ disposition?: CitationDisposition | CitationDisposition[];
1951
+ action_stage?: CitationActionStage | CitationActionStage[];
1952
+ limit?: number;
1953
+ cursor?: string;
1954
+ }
1955
+ /** Query params for `trademarks.citedBy()` — identical to `TrademarkCitationsParams`. */
1956
+ export type TrademarkCitedByParams = TrademarkCitationsParams;
1536
1957
  export interface OwnerRelatedParams {
1537
1958
  limit?: number;
1538
1959
  cursor?: string;
@@ -1548,7 +1969,8 @@ export type EntityRetrieveParams = Record<string, never>;
1548
1969
  export interface EntityListParams {
1549
1970
  q?: string;
1550
1971
  country_code?: string;
1551
- entity_type?: string;
1972
+ /** The kind of legal person (the rows' `legal_form`). Replaces `entity_type` (0.14.0). */
1973
+ legal_form?: string;
1552
1974
  publicly_traded?: boolean;
1553
1975
  ticker?: string;
1554
1976
  has_lei?: boolean;
@@ -1573,7 +1995,8 @@ export type EntityFamilyParams = Record<string, never>;
1573
1995
  export interface OwnerListParams {
1574
1996
  q?: string;
1575
1997
  country_code?: string;
1576
- entity_type?: string;
1998
+ /** The kind of legal person (the rows' `legal_form`). Replaces `entity_type` (0.14.0). */
1999
+ legal_form?: string;
1577
2000
  ticker?: string;
1578
2001
  lei?: string;
1579
2002
  publicly_traded?: boolean;
@@ -1620,10 +2043,17 @@ export interface OwnerTrademarksParams {
1620
2043
  vienna_codes?: string | string[];
1621
2044
  us_design_codes?: string | string[];
1622
2045
  filing_basis?: string | string[];
1623
- us_register_type?: 'principal' | 'supplemental';
2046
+ /**
2047
+ * The office register (`register.type`), case-insensitive: `principal` or
2048
+ * `supplemental` (US), the CIPO register category (CA), ... Replaces
2049
+ * `us_register_type` (0.14.0).
2050
+ */
2051
+ register_type?: string;
1624
2052
  opposition_status?: OppositionStatus;
1625
- opposition_closes_before?: string;
1626
- opposition_closes_after?: string;
2053
+ /** Opposition window closes on or after this date (YYYY-MM-DD). Replaces `opposition_closes_after`. */
2054
+ opposition_closes_gte?: string;
2055
+ /** Opposition window closes on or before this date (YYYY-MM-DD). Replaces `opposition_closes_before`. */
2056
+ opposition_closes_lte?: string;
1627
2057
  seniority_claims?: SeniorityClaims;
1628
2058
  filing_date_gte?: string;
1629
2059
  filing_date_gt?: string;
@@ -1669,6 +2099,15 @@ export interface OwnerTrademarksParams {
1669
2099
  updated_at_gt?: string;
1670
2100
  updated_at_lte?: string;
1671
2101
  updated_at_lt?: string;
2102
+ /**
2103
+ * When the mark family last changed. Grouped view only (a record-grain
2104
+ * request is a 400); pairs with `sort: 'family_updated_at'` for incremental
2105
+ * sync, which pages past 10,000 results on filter-only requests.
2106
+ */
2107
+ family_updated_at_gte?: string;
2108
+ family_updated_at_gt?: string;
2109
+ family_updated_at_lte?: string;
2110
+ family_updated_at_lt?: string;
1672
2111
  owner_name?: string;
1673
2112
  owner_publicly_traded?: boolean;
1674
2113
  owner_has_lei?: boolean;
@@ -1749,10 +2188,17 @@ export interface AttorneyTrademarksParams {
1749
2188
  vienna_codes?: string | string[];
1750
2189
  us_design_codes?: string | string[];
1751
2190
  filing_basis?: string | string[];
1752
- us_register_type?: 'principal' | 'supplemental';
2191
+ /**
2192
+ * The office register (`register.type`), case-insensitive: `principal` or
2193
+ * `supplemental` (US), the CIPO register category (CA), ... Replaces
2194
+ * `us_register_type` (0.14.0).
2195
+ */
2196
+ register_type?: string;
1753
2197
  opposition_status?: OppositionStatus;
1754
- opposition_closes_before?: string;
1755
- opposition_closes_after?: string;
2198
+ /** Opposition window closes on or after this date (YYYY-MM-DD). Replaces `opposition_closes_after`. */
2199
+ opposition_closes_gte?: string;
2200
+ /** Opposition window closes on or before this date (YYYY-MM-DD). Replaces `opposition_closes_before`. */
2201
+ opposition_closes_lte?: string;
1756
2202
  seniority_claims?: SeniorityClaims;
1757
2203
  filing_date_gte?: string;
1758
2204
  filing_date_gt?: string;
@@ -1798,6 +2244,15 @@ export interface AttorneyTrademarksParams {
1798
2244
  updated_at_gt?: string;
1799
2245
  updated_at_lte?: string;
1800
2246
  updated_at_lt?: string;
2247
+ /**
2248
+ * When the mark family last changed. Grouped view only (a record-grain
2249
+ * request is a 400); pairs with `sort: 'family_updated_at'` for incremental
2250
+ * sync, which pages past 10,000 results on filter-only requests.
2251
+ */
2252
+ family_updated_at_gte?: string;
2253
+ family_updated_at_gt?: string;
2254
+ family_updated_at_lte?: string;
2255
+ family_updated_at_lt?: string;
1801
2256
  owner_name?: string;
1802
2257
  owner_id?: string;
1803
2258
  owner_publicly_traded?: boolean;
@@ -1884,10 +2339,17 @@ export interface FirmTrademarksParams {
1884
2339
  vienna_codes?: string | string[];
1885
2340
  us_design_codes?: string | string[];
1886
2341
  filing_basis?: string | string[];
1887
- us_register_type?: 'principal' | 'supplemental';
2342
+ /**
2343
+ * The office register (`register.type`), case-insensitive: `principal` or
2344
+ * `supplemental` (US), the CIPO register category (CA), ... Replaces
2345
+ * `us_register_type` (0.14.0).
2346
+ */
2347
+ register_type?: string;
1888
2348
  opposition_status?: OppositionStatus;
1889
- opposition_closes_before?: string;
1890
- opposition_closes_after?: string;
2349
+ /** Opposition window closes on or after this date (YYYY-MM-DD). Replaces `opposition_closes_after`. */
2350
+ opposition_closes_gte?: string;
2351
+ /** Opposition window closes on or before this date (YYYY-MM-DD). Replaces `opposition_closes_before`. */
2352
+ opposition_closes_lte?: string;
1891
2353
  seniority_claims?: SeniorityClaims;
1892
2354
  filing_date_gte?: string;
1893
2355
  filing_date_gt?: string;
@@ -1933,6 +2395,15 @@ export interface FirmTrademarksParams {
1933
2395
  updated_at_gt?: string;
1934
2396
  updated_at_lte?: string;
1935
2397
  updated_at_lt?: string;
2398
+ /**
2399
+ * When the mark family last changed. Grouped view only (a record-grain
2400
+ * request is a 400); pairs with `sort: 'family_updated_at'` for incremental
2401
+ * sync, which pages past 10,000 results on filter-only requests.
2402
+ */
2403
+ family_updated_at_gte?: string;
2404
+ family_updated_at_gt?: string;
2405
+ family_updated_at_lte?: string;
2406
+ family_updated_at_lt?: string;
1936
2407
  owner_name?: string;
1937
2408
  owner_id?: string;
1938
2409
  owner_publicly_traded?: boolean;
@@ -1962,9 +2433,11 @@ export interface FirmTrademarksParams {
1962
2433
  limit?: number;
1963
2434
  cursor?: string;
1964
2435
  }
1965
- export type ProceedingAggregation = 'outcome' | 'party_role' | 'nice_class' | 'office_code' | 'filed_year';
2436
+ export type ProceedingAggregation = 'outcome' | 'party_role' | 'nice_class' | 'office_code' | 'filed_year' | 'trademark_role';
1966
2437
  export interface ProceedingListParams {
1967
2438
  trademark_id?: string;
2439
+ /** Which side the linked mark is on: `contested` (opposed / appealed) or `asserted` (pleaded by the opposer). */
2440
+ trademark_role?: 'contested' | 'asserted';
1968
2441
  proceeding_type?: string;
1969
2442
  status?: string;
1970
2443
  q?: string;
@@ -1984,6 +2457,34 @@ export interface ProceedingListParams {
1984
2457
  limit?: number;
1985
2458
  cursor?: string;
1986
2459
  }
2460
+ /** Query params for the cross-mark `GET /v1/citations`. */
2461
+ export interface CitationListParams {
2462
+ /**
2463
+ * Issuing office, one value or a list (`'US'` or `['US', 'EM']`, serialized
2464
+ * as `?offices=US,EM`). WIPO ST.3 uppercase (`US`); legacy acronym slugs
2465
+ * (`uspto`) and `EU` are also accepted. Unknown codes return an empty list.
2466
+ */
2467
+ offices?: string | string[];
2468
+ disposition?: CitationDisposition | CitationDisposition[];
2469
+ action_stage?: CitationActionStage | CitationActionStage[];
2470
+ refusal_type?: CitationRefusalType | CitationRefusalType[];
2471
+ /** Filter by citing application (`tm_...`). */
2472
+ trademark_id?: string;
2473
+ /** Filter by cited mark (`tm_...`). */
2474
+ cited_trademark_id?: string;
2475
+ /**
2476
+ * Exact cited reference (digits; punctuation is ignored). Requires
2477
+ * `offices` — an office-less reference lookup is unindexable and 400s.
2478
+ */
2479
+ cited_ref?: string;
2480
+ /** Office action date >= (YYYY-MM-DD). */
2481
+ action_date_gte?: string;
2482
+ /** Office action date <= (YYYY-MM-DD). */
2483
+ action_date_lte?: string;
2484
+ sort?: '-action_date' | 'action_date';
2485
+ limit?: number;
2486
+ cursor?: string;
2487
+ }
1987
2488
  export type ConveyanceType = 'assignment' | 'security_interest' | 'release' | 'merger' | 'name_change' | 'license' | 'partial_assignment' | 'correction' | 'entity_conversion' | 'other';
1988
2489
  export interface AssignmentListParams {
1989
2490
  owner_id?: string;
@@ -2145,6 +2646,14 @@ export interface TrademarkSearchBody {
2145
2646
  match?: MatchMode;
2146
2647
  /** ENG-106 — exclude marks whose text contains this substring (case/accent-insensitive). Composable with any match mode. */
2147
2648
  mark_text_not_contains?: string;
2649
+ /**
2650
+ * Several exact terms in ONE request: every mark that is an exact match
2651
+ * under `match: 'exact'` rules (case, accents, punctuation and spacing) for
2652
+ * ANY of the terms. 1-200 terms. Implies
2653
+ * `match: 'exact'` and replaces `query`; each hit carries `matched_terms[]`.
2654
+ * One page costs the same as any search page regardless of term count.
2655
+ */
2656
+ q_any?: string[];
2148
2657
  filters?: {
2149
2658
  /**
2150
2659
  * Coarse status bucket. Accepts a single value or an array to match any
@@ -2167,10 +2676,13 @@ export interface TrademarkSearchBody {
2167
2676
  vienna_codes?: string[];
2168
2677
  us_design_codes?: string[];
2169
2678
  filing_basis?: string[];
2170
- us_register_type?: 'principal' | 'supplemental';
2679
+ /** The office register (`register.type`), case-insensitive. Replaces `us_register_type`. */
2680
+ register_type?: string;
2171
2681
  opposition_status?: OppositionStatus;
2172
- opposition_closes_before?: string;
2173
- opposition_closes_after?: string;
2682
+ /** Replaces `opposition_closes_after`. */
2683
+ opposition_closes_gte?: string;
2684
+ /** Replaces `opposition_closes_before`. */
2685
+ opposition_closes_lte?: string;
2174
2686
  seniority_claims?: SeniorityClaims;
2175
2687
  goods_services_text?: string;
2176
2688
  filing_date?: DateRangeFilter;
@@ -2184,6 +2696,8 @@ export interface TrademarkSearchBody {
2184
2696
  first_use_in_commerce_date?: DateRangeFilter;
2185
2697
  termination_date?: DateRangeFilter;
2186
2698
  updated_at?: DateRangeFilter;
2699
+ /** When the mark family last changed (grouped view only). */
2700
+ family_updated_at?: DateRangeFilter;
2187
2701
  owner_id?: string;
2188
2702
  owner_name?: string;
2189
2703
  owner_publicly_traded?: boolean;
@@ -2192,6 +2706,13 @@ export interface TrademarkSearchBody {
2192
2706
  owner_lei?: string;
2193
2707
  attorney_id?: string;
2194
2708
  firm_id?: string;
2709
+ attorney_firm_name?: string;
2710
+ /** Resolved entity (`ent_*`); see {@link TrademarkListParams.entity_id}. */
2711
+ entity_id?: string;
2712
+ /** GLEIF family group (`ent_*`); see {@link TrademarkListParams.entity_group}. */
2713
+ entity_group?: string;
2714
+ /** Restrict to these trademark ids (`tm_*`). */
2715
+ trademark_ids?: string[];
2195
2716
  application_number?: string;
2196
2717
  registration_number?: string;
2197
2718
  ir_number?: string;
@@ -2205,6 +2726,7 @@ export interface TrademarkSearchBody {
2205
2726
  };
2206
2727
  options?: {
2207
2728
  aggregations?: TrademarkAggregationName[];
2729
+ aggregation_mode?: TrademarkAggregationMode;
2208
2730
  aggregations_only?: boolean;
2209
2731
  include_total?: boolean;
2210
2732
  highlights?: boolean;
@@ -2233,10 +2755,6 @@ export interface TrademarkSearchBody {
2233
2755
  * endpoint has been consolidated into `POST /v1/trademarks`.
2234
2756
  */
2235
2757
  export type SearchV2Body = TrademarkSearchBody;
2236
- export interface CrossEntitySuggestParams {
2237
- q: string;
2238
- type?: 'trademark' | 'owner' | 'attorney' | 'firm';
2239
- }
2240
2758
  /**
2241
2759
  * Query parameters for `GET /v1/goods-services` (browse/search the accepted
2242
2760
  * terms catalog). At least one of `q` or `class` must be provided.
@@ -2289,42 +2807,99 @@ export interface PortfolioListParams {
2289
2807
  export interface PortfolioRetrieveParams {
2290
2808
  limit?: number;
2291
2809
  cursor?: string;
2810
+ /**
2811
+ * Restrict the embedded trademarks list to the membership carrying this
2812
+ * external reference (ENG-342). References are unique within a portfolio,
2813
+ * so this returns at most one row. Compared with case-sensitive byte
2814
+ * equality after trimming.
2815
+ */
2816
+ external_ref?: string;
2292
2817
  }
2293
- export interface PortfolioAddTrademarksBody {
2294
- trademark_ids: string[];
2818
+ /** One entry of the `items` form of {@link PortfolioAddTrademarksBody}. */
2819
+ export interface PortfolioAddTrademarkItem {
2820
+ /** Prefixed trademark id (`tm_*`). */
2821
+ trademark_id: string;
2822
+ /**
2823
+ * Your own docketing reference for this membership (1-255 chars). Unique
2824
+ * within the portfolio, compared with case-sensitive byte equality after
2825
+ * trimming.
2826
+ *
2827
+ * **Immutable once set**: binding a different reference to a trademark that
2828
+ * already carries one is a `409 external_ref_conflict` — remove the mark and
2829
+ * add it again to rebind. Attaching a reference to a membership that has
2830
+ * none is allowed. Reusing a reference already bound to a DIFFERENT mark in
2831
+ * the same portfolio is the same 409.
2832
+ */
2833
+ external_ref?: string;
2295
2834
  }
2296
- export interface PortfolioRemoveTrademarksBody {
2835
+ /**
2836
+ * Body of `portfolios.addTrademarks()`. Supply EXACTLY ONE of `trademark_ids`
2837
+ * or `items` — the `?: never` members make a body carrying both a compile-time
2838
+ * error, and the API rejects it with a `400 validation_error`.
2839
+ *
2840
+ * The two forms differ in how they treat duplicates, deliberately: see the
2841
+ * per-field docs below.
2842
+ *
2843
+ * Both forms are capped at 100 entries per request. That ceiling is physical,
2844
+ * not a policy dial — the edge WAF caps request bodies at 8 KB.
2845
+ *
2846
+ * Any 409 (`external_ref_conflict`, or the `resource_quota_exceeded`
2847
+ * managed-marks cap) rolls the WHOLE batch back. Unknown ids stay lenient and
2848
+ * are counted under `not_found`.
2849
+ */
2850
+ export type PortfolioAddTrademarksBody = {
2851
+ /**
2852
+ * Trademark ids to add (1-100). **LENIENT on duplicates**: a repeated id
2853
+ * is silently deduplicated, and every membership is created with
2854
+ * `external_ref: null`.
2855
+ */
2297
2856
  trademark_ids: string[];
2298
- }
2299
- export interface PortfolioDeadlineParams {
2300
- due_before: string;
2301
- type?: string;
2302
- limit?: number;
2303
- cursor?: string;
2304
- }
2857
+ items?: never;
2858
+ } | {
2859
+ /**
2860
+ * Trademarks to add, each optionally carrying an `external_ref` (1-100).
2861
+ * **STRICT on duplicates**: a repeated `trademark_id`, or a repeated
2862
+ * `external_ref`, is a `400 validation_error` raised BEFORE any write —
2863
+ * an explicit request that binds one mark to two references has no
2864
+ * defensible resolution.
2865
+ */
2866
+ items: PortfolioAddTrademarkItem[];
2867
+ trademark_ids?: never;
2868
+ };
2869
+ /**
2870
+ * Body of `portfolios.removeTrademarks()`. Supply EXACTLY ONE of
2871
+ * `trademark_ids` or `external_refs` — a body carrying both is a compile-time
2872
+ * error here and a `400 validation_error` at the API.
2873
+ */
2874
+ export type PortfolioRemoveTrademarksBody = {
2875
+ /**
2876
+ * Trademark ids to remove (1-100). Duplicates are silently deduplicated;
2877
+ * ids that are not in the portfolio simply match nothing.
2878
+ */
2879
+ trademark_ids: string[];
2880
+ external_refs?: never;
2881
+ } | {
2882
+ /**
2883
+ * External references to remove (1-100), for callers that only know
2884
+ * their own docketing key (ENG-342). Duplicates are silently
2885
+ * deduplicated; references that match no membership match nothing.
2886
+ */
2887
+ external_refs: string[];
2888
+ trademark_ids?: never;
2889
+ };
2890
+ /**
2891
+ * Query parameters for `GET /v1/portfolios/{id}/deadlines`.
2892
+ *
2893
+ * Derived from the spec, like the sibling {@link DeadlineListParams}: this used
2894
+ * to be hand-written with `type?: string`, which stopped mirroring the contract
2895
+ * once the route closed `type` to the deadline-type enum. `due_before` is an
2896
+ * inclusive ISO 8601 `YYYY-MM-DD` cutoff; omitting it lets the API apply its
2897
+ * own horizon (720 days after the computation date).
2898
+ */
2899
+ export type PortfolioDeadlineParams = NonNullable<operations['listPortfolioDeadlines']['parameters']['query']>;
2305
2900
  export interface PortfolioDeadlinesIcalParams {
2306
2901
  reminder_days?: string;
2307
2902
  }
2308
- export interface SavedSearchCreateParams {
2309
- name: string;
2310
- description?: string;
2311
- query: Record<string, unknown>;
2312
- metadata?: Record<string, string>;
2313
- }
2314
- export interface SavedSearchUpdateParams {
2315
- name?: string;
2316
- description?: string | null;
2317
- query?: Record<string, unknown>;
2318
- metadata?: Record<string, string | null>;
2319
- }
2320
- export interface SavedSearchListParams {
2321
- limit?: number;
2322
- cursor?: string;
2323
- }
2324
- export interface SavedSearchExecuteParams {
2325
- limit?: number;
2326
- cursor?: string;
2327
- }
2328
2903
  /** Feedback type discriminator. */
2329
2904
  export type FeedbackType = 'data_issue' | 'bug' | 'feature_request' | 'other';
2330
2905
  /** Feedback lifecycle status. */
@@ -2380,14 +2955,11 @@ export interface FeedbackListParams {
2380
2955
  }
2381
2956
  /**
2382
2957
  * Body for `watches.create(...)`.
2383
- *
2384
- * Either `query` or `from_saved_search` (passed via the second-arg
2385
- * `RequestOptions`-style query — see `WatchCreateOptions`) must be set.
2386
2958
  */
2387
2959
  export interface WatchCreateParams {
2388
2960
  name: string;
2389
2961
  watch_type: WatchType;
2390
- /** v1 watch query DSL. Required unless hydrating from a saved search. */
2962
+ /** v1 watch query DSL. */
2391
2963
  query?: WatchQuery | Record<string, unknown>;
2392
2964
  /**
2393
2965
  * v1 accepts only `'always_per_alert'` — the API rejects the digest modes
@@ -2403,18 +2975,6 @@ export interface WatchCreateParams {
2403
2975
  customer_reference?: string | null;
2404
2976
  metadata?: Record<string, unknown>;
2405
2977
  }
2406
- /**
2407
- * Optional query string params for `watches.create(...)`. Pass via the
2408
- * SDK's `?from_saved_search=ssr_...` query string.
2409
- *
2410
- * Note: `backfill_days` was removed — the server rejects it with 400
2411
- * (`unsupported_in_v1`). Historical replay-from-date arrives in v1.1; in
2412
- * v1 only future sync_runs trigger evaluation.
2413
- */
2414
- export interface WatchCreateQueryParams {
2415
- /** Hydrate `query` from a saved search id (`ssr_...`). */
2416
- from_saved_search?: string;
2417
- }
2418
2978
  export interface WatchUpdateParams {
2419
2979
  name?: string;
2420
2980
  query?: WatchQuery | Record<string, unknown>;
@@ -2482,13 +3042,20 @@ export interface AlertLookupParams {
2482
3042
  export interface WebhookCreateParams {
2483
3043
  url: string;
2484
3044
  description?: string;
3045
+ /**
3046
+ * Subscribable types only: `alert.created`, `trademark.status_changed`,
3047
+ * `office_action.issued`. The last two are accepted now but not yet emitted.
3048
+ */
2485
3049
  enabled_events: Array<WebhookEventType | string>;
3050
+ /** Portfolio scope, applied to every event type. See {@link Webhook.portfolio_id}. */
3051
+ portfolio_id?: string | null;
2486
3052
  metadata?: Record<string, unknown>;
2487
3053
  }
2488
3054
  export interface WebhookUpdateParams {
2489
3055
  url?: string;
2490
3056
  description?: string | null;
2491
3057
  enabled_events?: Array<WebhookEventType | string>;
3058
+ portfolio_id?: string | null;
2492
3059
  status?: WebhookStatus;
2493
3060
  metadata?: Record<string, unknown>;
2494
3061
  }
@@ -2513,6 +3080,15 @@ export interface OrgEventListParams {
2513
3080
  office_code?: string | string[];
2514
3081
  trademark_id?: string;
2515
3082
  since?: string;
3083
+ sort?: '-id' | 'id';
3084
+ after?: string;
3085
+ /**
3086
+ * `ptf_*` portfolio filter. Strict across EVERY family, `alert.created`
3087
+ * included: an event matches only when its mark was a member of the
3088
+ * portfolio at the time the event was recorded. Requires the
3089
+ * `portfolios:manage` scope in addition to `events:read`.
3090
+ */
3091
+ portfolio_id?: string;
2516
3092
  cursor?: string;
2517
3093
  limit?: number;
2518
3094
  }
@@ -2554,7 +3130,7 @@ export interface LogListParams {
2554
3130
  method?: string;
2555
3131
  /** Filter by API key ID (key_...). */
2556
3132
  api_key_id?: string;
2557
- /** Filter by endpoint type (search, read, monitoring, screening, clearance, check, image_search, export, reference, utility). */
3133
+ /** Filter by endpoint type (analytics, class_lookup, class_suggest, compare, compute, fees_estimate, gs_draft, gs_validate, image_search, listing_screening, market_analytics, mcp, monitoring, read, reconcile, reference, rules_lookup, screening, search, utility, write). Historical rows may carry a type the API no longer writes. */
2558
3134
  endpoint_type?: string;
2559
3135
  /** Case-insensitive substring match against path or request ID. */
2560
3136
  search?: string;
@@ -2572,6 +3148,16 @@ export interface UsageSummaryParams {
2572
3148
  /** Restrict summary to a specific endpoint type. */
2573
3149
  endpoint_type?: string;
2574
3150
  }
3151
+ /**
3152
+ * Query params for `GET /v1/organization/usage/estimate`. Omit both for the
3153
+ * last 30 days; give both to price a specific window.
3154
+ */
3155
+ export interface UsageEstimateParams {
3156
+ /** Start of the window (YYYY-MM-DD). Required with `to`. */
3157
+ from?: string;
3158
+ /** End of the window (YYYY-MM-DD), inclusive. Required with `from`. */
3159
+ to?: string;
3160
+ }
2575
3161
  /** Shared `GET /v1/screening` options (everything except the candidate). */
2576
3162
  export interface ScreenOptions {
2577
3163
  /** Intended Nice class numbers (1-45). */
@@ -2851,7 +3437,52 @@ export type CompareConflict = {
2851
3437
  status?: 'active' | 'pending' | 'inactive' | 'unknown';
2852
3438
  };
2853
3439
  /** A compare batch contains at least one and at most ten conflicts. */
2854
- export type CompareConflicts = [CompareConflict] | [CompareConflict, CompareConflict] | [CompareConflict, CompareConflict, CompareConflict] | [CompareConflict, CompareConflict, CompareConflict, CompareConflict] | [CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict] | [CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict] | [CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict] | [CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict] | [CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict] | [CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict];
3440
+ export type CompareConflicts = [CompareConflict] | [CompareConflict, CompareConflict] | [CompareConflict, CompareConflict, CompareConflict] | [CompareConflict, CompareConflict, CompareConflict, CompareConflict] | [CompareConflict, CompareConflict, CompareConflict, CompareConflict, CompareConflict] | [
3441
+ CompareConflict,
3442
+ CompareConflict,
3443
+ CompareConflict,
3444
+ CompareConflict,
3445
+ CompareConflict,
3446
+ CompareConflict
3447
+ ] | [
3448
+ CompareConflict,
3449
+ CompareConflict,
3450
+ CompareConflict,
3451
+ CompareConflict,
3452
+ CompareConflict,
3453
+ CompareConflict,
3454
+ CompareConflict
3455
+ ] | [
3456
+ CompareConflict,
3457
+ CompareConflict,
3458
+ CompareConflict,
3459
+ CompareConflict,
3460
+ CompareConflict,
3461
+ CompareConflict,
3462
+ CompareConflict,
3463
+ CompareConflict
3464
+ ] | [
3465
+ CompareConflict,
3466
+ CompareConflict,
3467
+ CompareConflict,
3468
+ CompareConflict,
3469
+ CompareConflict,
3470
+ CompareConflict,
3471
+ CompareConflict,
3472
+ CompareConflict,
3473
+ CompareConflict
3474
+ ] | [
3475
+ CompareConflict,
3476
+ CompareConflict,
3477
+ CompareConflict,
3478
+ CompareConflict,
3479
+ CompareConflict,
3480
+ CompareConflict,
3481
+ CompareConflict,
3482
+ CompareConflict,
3483
+ CompareConflict,
3484
+ CompareConflict
3485
+ ];
2855
3486
  /** `POST /v1/compare` request body. `conflicts` accepts 1-10 items. */
2856
3487
  export interface CompareParams {
2857
3488
  candidate: CompareCandidate;
@@ -3185,7 +3816,7 @@ export interface ListResponseBody<T> {
3185
3816
  request_id: string;
3186
3817
  search_meta?: SearchMeta;
3187
3818
  source_sync?: TrademarkDocumentSourceSync;
3188
- /** Faceted aggregation buckets (V2 search and saved search results). */
3819
+ /** Faceted aggregation buckets (V2 search results). */
3189
3820
  aggregations?: Record<string, Record<string, number>>;
3190
3821
  /**
3191
3822
  * TSK-127 — display-name labels for aggregation bucket keys, shaped
@@ -3194,35 +3825,15 @@ export interface ListResponseBody<T> {
3194
3825
  * human-readable bucket labels without a follow-up lookup.
3195
3826
  */
3196
3827
  aggregation_metadata?: Record<string, Record<string, string>>;
3828
+ /**
3829
+ * Deadline lists only (`GET /v1/deadlines`, `GET /v1/portfolios/{id}/deadlines`):
3830
+ * marks in scope that could not be fully computed. An array on the first page,
3831
+ * `null` on continuation pages.
3832
+ */
3833
+ unsupported_marks?: DeadlineUnsupportedMark[] | null;
3197
3834
  }
3198
- export interface OfficeAnalytics {
3199
- object: 'office_analytics';
3200
- code: string;
3201
- total_marks: number;
3202
- registered_count: number;
3203
- pending_count: number;
3204
- expired_count: number;
3205
- cancelled_count: number;
3206
- abandoned_count: number;
3207
- registration_rate: number | null;
3208
- jurisdiction_count: number;
3209
- earliest_filing: string | null;
3210
- latest_filing: string | null;
3211
- top_classes: Array<{
3212
- class: number;
3213
- count: number;
3214
- pct: number;
3215
- }> | null;
3216
- yearly_trend: Array<{
3217
- year: number;
3218
- filed: number;
3219
- registered: number;
3220
- abandoned: number;
3221
- }> | null;
3222
- stats_computed_at: string;
3223
- /** Per-request id echoed at the top level of the response body (`*Response` in the OpenAPI spec). */
3224
- request_id: string;
3225
- }
3835
+ /** `GET /v1/analytics/offices/{code}`. */
3836
+ export type OfficeAnalytics = components['schemas']['OfficeAnalyticsResponse'];
3226
3837
  export interface MarketAnalytics {
3227
3838
  object: 'market_analytics';
3228
3839
  total_marks: number;
@@ -3251,4 +3862,7 @@ export interface ClassificationAnalytics {
3251
3862
  /** Per-request id echoed at the top level of the response body (`*Response` in the OpenAPI spec). */
3252
3863
  request_id: string;
3253
3864
  }
3865
+ /** Published credit prices, including the schedule version. */
3866
+ export type CreditPrice = components['schemas']['CreditPrice'];
3867
+ export type CreditPricingResponse = components['schemas']['CreditPricingResponse'];
3254
3868
  //# sourceMappingURL=types.d.ts.map