@dpdpguard/react-native 1.1.0 → 1.2.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.
@@ -0,0 +1,2877 @@
1
+ /**
2
+ * This file was auto-generated by openapi-typescript.
3
+ * Do not make direct changes to the file.
4
+ */
5
+
6
+ export interface paths {
7
+ "/cm/v1/consent": {
8
+ parameters: {
9
+ query?: never;
10
+ header?: never;
11
+ path?: never;
12
+ cookie?: never;
13
+ };
14
+ get?: never;
15
+ put?: never;
16
+ /**
17
+ * Record a new consent on behalf of a known data principal.
18
+ * @description Requires the `dpdp_cm_api_enabled` flag; while it is off, this route
19
+ * behaves as if it doesn't exist (404). Blocks tracking/marketing/
20
+ * targeting purposes for verified minors when the organization has
21
+ * `disableTrackingForMinors` set (403).
22
+ */
23
+ post: operations["recordConsent"];
24
+ delete?: never;
25
+ options?: never;
26
+ head?: never;
27
+ patch?: never;
28
+ trace?: never;
29
+ };
30
+ "/cm/v1/consent/{consentId}": {
31
+ parameters: {
32
+ query?: never;
33
+ header?: never;
34
+ path?: never;
35
+ cookie?: never;
36
+ };
37
+ /** Fetch a consent record by id. */
38
+ get: operations["getConsent"];
39
+ put?: never;
40
+ post?: never;
41
+ /**
42
+ * Withdraw a consent record.
43
+ * @description Withdrawal is deliberately as easy as giving consent: no request body, one call, mirrors the DPDP requirement.
44
+ */
45
+ delete: operations["withdrawConsent"];
46
+ options?: never;
47
+ head?: never;
48
+ patch?: never;
49
+ trace?: never;
50
+ };
51
+ "/api/v1/org/{slug}": {
52
+ parameters: {
53
+ query?: never;
54
+ header?: never;
55
+ path?: never;
56
+ cookie?: never;
57
+ };
58
+ /**
59
+ * Resolve an organization by slug (public).
60
+ * @description Requires the `dpdp_mobile_api_enabled` flag; while it is off, this route behaves as if it doesn't exist (404).
61
+ */
62
+ get: operations["getOrgBySlug"];
63
+ put?: never;
64
+ post?: never;
65
+ delete?: never;
66
+ options?: never;
67
+ head?: never;
68
+ patch?: never;
69
+ trace?: never;
70
+ };
71
+ "/api/v1/org/{orgId}/notices": {
72
+ parameters: {
73
+ query?: never;
74
+ header?: never;
75
+ path?: never;
76
+ cookie?: never;
77
+ };
78
+ /** List published notices for an organization (public, multilingual). */
79
+ get: operations["getNoticesForOrg"];
80
+ put?: never;
81
+ post?: never;
82
+ delete?: never;
83
+ options?: never;
84
+ head?: never;
85
+ patch?: never;
86
+ trace?: never;
87
+ };
88
+ "/api/v1/notices/{noticeId}": {
89
+ parameters: {
90
+ query?: never;
91
+ header?: never;
92
+ path?: never;
93
+ cookie?: never;
94
+ };
95
+ /** Fetch a single notice by id (public). */
96
+ get: operations["getNoticeById"];
97
+ put?: never;
98
+ post?: never;
99
+ delete?: never;
100
+ options?: never;
101
+ head?: never;
102
+ patch?: never;
103
+ trace?: never;
104
+ };
105
+ "/api/v1/org/{orgId}/banner-config": {
106
+ parameters: {
107
+ query?: never;
108
+ header?: never;
109
+ path?: never;
110
+ cookie?: never;
111
+ };
112
+ /**
113
+ * Resolve banner config for a web domain, native app, or org-default (public).
114
+ * @description Pass `?domain=` for the web scope, `?appId=` for the native-app scope, or neither for org-default. Response `configVersion` is a presentation-config version, distinct from `notice.version` — a cosmetic edit bumps it without ever triggering re-consent.
115
+ */
116
+ get: operations["getBannerConfig"];
117
+ put?: never;
118
+ post?: never;
119
+ delete?: never;
120
+ options?: never;
121
+ head?: never;
122
+ patch?: never;
123
+ trace?: never;
124
+ };
125
+ "/api/v1/widget/config": {
126
+ parameters: {
127
+ query?: never;
128
+ header?: never;
129
+ path?: never;
130
+ cookie?: never;
131
+ };
132
+ /**
133
+ * Resolve org, notice, and banner styling for the no-React embeddable widget script in one round trip (public).
134
+ * @description Requires the `dpdp_mobile_api_enabled` flag; while it is off, this route behaves as if it doesn't exist (404). Powers the no-React embeddable widget script's single config call: given the domain-group id its script tag was generated with (`?id=`) and the embedding page's hostname (`?domain=`), resolves the organization, the notice that applies to that domain group (its own if published, else the org's default), and the domain group's banner styling. Strict domain check: a `domainGroupId` whose organization has no matching registered `domains` row for the given hostname resolves to 404, mirroring the same trust boundary as fetching a published notice.
135
+ */
136
+ get: operations["getWidgetConfig"];
137
+ put?: never;
138
+ post?: never;
139
+ delete?: never;
140
+ options?: never;
141
+ head?: never;
142
+ patch?: never;
143
+ trace?: never;
144
+ };
145
+ "/api/v1/auth/broker-token": {
146
+ parameters: {
147
+ query?: never;
148
+ header?: never;
149
+ path?: never;
150
+ cookie?: never;
151
+ };
152
+ get?: never;
153
+ put?: never;
154
+ /**
155
+ * Mint a short-lived principal access token.
156
+ * @description Authenticated with a **service API key** (never a principal credential). No refresh token is issued — the mobile app re-brokers via its own backend once the returned token expires.
157
+ */
158
+ post: operations["brokerToken"];
159
+ delete?: never;
160
+ options?: never;
161
+ head?: never;
162
+ patch?: never;
163
+ trace?: never;
164
+ };
165
+ "/api/v1/cm/signal": {
166
+ parameters: {
167
+ query?: never;
168
+ header?: never;
169
+ path?: never;
170
+ cookie?: never;
171
+ };
172
+ get?: never;
173
+ put?: never;
174
+ /**
175
+ * Government CM API Bridge — receive an inbound consent signal from a registered third-party Consent Manager.
176
+ * @description Requires the `dpdp_cm_inbound_signals_enabled` flag; while it is off, this route behaves as if it doesn't exist (404). Authenticated with the same org-scoped API key as `/cm/v1/consent` (never a brokered principal token) — the reverse direction of that flow: here a third-party Consent Manager pushes a signal on behalf of one of its Data Principals, rather than the fiduciary recording its own consent. MeitY's registered-CM interoperability spec isn't published yet, so every signal lands `mappingStatus: "unresolved"` unless it exactly repeats a signal already recorded, in which case it lands `"duplicate"` — CM webhooks are expected to retry, so a repeat delivery still returns 201 rather than erroring.
177
+ * **Known gap:** unlike every other `/api/v1` endpoint, this route's error responses use the free-text-only `Error` shape, not `ApiError` — it predates this API's error-catalog rollout to `/api/v1` and hasn't been migrated yet. Treat this as a documented inconsistency, not a schema-design choice to imitate for new endpoints.
178
+ */
179
+ post: operations["receiveCmSignal"];
180
+ delete?: never;
181
+ options?: never;
182
+ head?: never;
183
+ patch?: never;
184
+ trace?: never;
185
+ };
186
+ "/api/v1/link-anonymous-consent": {
187
+ parameters: {
188
+ query?: never;
189
+ header?: never;
190
+ path?: never;
191
+ cookie?: never;
192
+ };
193
+ get?: never;
194
+ put?: never;
195
+ /**
196
+ * Reconcile a guest's anonymous consent trail into the now-known principal.
197
+ * @description Authenticated with a brokered principal access token. Idempotent: re-linking the same anonymousId never double-materializes a profile-bound row.
198
+ */
199
+ post: operations["linkAnonymousConsent"];
200
+ delete?: never;
201
+ options?: never;
202
+ head?: never;
203
+ patch?: never;
204
+ trace?: never;
205
+ };
206
+ "/api/v1/consents/anonymous": {
207
+ parameters: {
208
+ query?: never;
209
+ header?: never;
210
+ path?: never;
211
+ cookie?: never;
212
+ };
213
+ get?: never;
214
+ put?: never;
215
+ /**
216
+ * Record consent for a not-yet-authenticated guest.
217
+ * @description Unauthenticated public write, keyed by a client-generated `anonymousId`. Rate-limited. Accepts an `Idempotency-Key` header — a retried request after a network timeout returns the original response instead of double-writing the consent event.
218
+ */
219
+ post: operations["giveConsentAnonymous"];
220
+ delete?: never;
221
+ options?: never;
222
+ head?: never;
223
+ patch?: never;
224
+ trace?: never;
225
+ };
226
+ "/api/v1/dsr": {
227
+ parameters: {
228
+ query?: never;
229
+ header?: never;
230
+ path?: never;
231
+ cookie?: never;
232
+ };
233
+ /** List the caller's own DSR requests, with SLA `dueAt`. */
234
+ get: operations["listDsrRequestsForCurrentUser"];
235
+ put?: never;
236
+ /**
237
+ * File a Data Subject Request.
238
+ * @description Authenticated with a brokered principal access token, not a staff login. Requires the caller's principal to belong to the organization (own org, or a prior consent link). Accepts an `Idempotency-Key` header.
239
+ */
240
+ post: operations["createDsrRequest"];
241
+ delete?: never;
242
+ options?: never;
243
+ head?: never;
244
+ patch?: never;
245
+ trace?: never;
246
+ };
247
+ "/api/v1/grievances": {
248
+ parameters: {
249
+ query?: never;
250
+ header?: never;
251
+ path?: never;
252
+ cookie?: never;
253
+ };
254
+ /** List the caller's own grievances, with SLA `dueAt`. */
255
+ get: operations["listGrievancesForCurrentUser"];
256
+ put?: never;
257
+ /**
258
+ * File a grievance.
259
+ * @description Authenticated with a brokered principal access token. Requires the caller's principal to belong to the organization (own org, or a prior consent link). Accepts an `Idempotency-Key` header.
260
+ */
261
+ post: operations["createGrievance"];
262
+ delete?: never;
263
+ options?: never;
264
+ head?: never;
265
+ patch?: never;
266
+ trace?: never;
267
+ };
268
+ "/api/v1/nomination": {
269
+ parameters: {
270
+ query?: never;
271
+ header?: never;
272
+ path?: never;
273
+ cookie?: never;
274
+ };
275
+ /** Fetch the caller's current successor nomination, or null. */
276
+ get: operations["getNomination"];
277
+ /**
278
+ * Set or replace the caller's successor nomination.
279
+ * @description Idempotent in effect: re-calling with new details updates the same active nomination row rather than creating a second one.
280
+ */
281
+ put: operations["upsertNomination"];
282
+ post?: never;
283
+ /**
284
+ * Revoke the caller's successor nomination.
285
+ * @description Withdrawal-parity with consent: revoking is one call, same friction as setting a nomination. A no-op (still 200) if none was active.
286
+ */
287
+ delete: operations["revokeNomination"];
288
+ options?: never;
289
+ head?: never;
290
+ patch?: never;
291
+ trace?: never;
292
+ };
293
+ "/api/v1/age/verify-parent": {
294
+ parameters: {
295
+ query?: never;
296
+ header?: never;
297
+ path?: never;
298
+ cookie?: never;
299
+ };
300
+ get?: never;
301
+ put?: never;
302
+ /**
303
+ * Verify parental consent via an authorized-entity opaque token.
304
+ * @description Verifies via a DigiLocker/authorized-entity opaque token. Only the opaque token is transmitted; no raw ID document leaves the device. There is no `childUserId` parameter — the brokered principal *is* the profile being verified.
305
+ */
306
+ post: operations["verifyParent"];
307
+ delete?: never;
308
+ options?: never;
309
+ head?: never;
310
+ patch?: never;
311
+ trace?: never;
312
+ };
313
+ "/api/v1/retention/due": {
314
+ parameters: {
315
+ query?: never;
316
+ header?: never;
317
+ path?: never;
318
+ cookie?: never;
319
+ };
320
+ /**
321
+ * List the organization's data principals past their retention window (docs/specs/crm-backend-integration-blockers.md, B1).
322
+ * @description Read-only: returns active (not yet cancelled/executed) `scheduledErasures` rows whose window has already elapsed, so a fiduciary's server integration can trigger its own erasure automation instead of a human watching the dpdpbot dashboard. Requires the `dpdp_retention_due_api_enabled` flag; while it is off, this route behaves as if it doesn't exist (404). Write access to retention policies and scheduled erasures stays dashboard-only (ADR-007 D3) — there is no corresponding write route.
323
+ */
324
+ get: operations["listDueRetentions"];
325
+ put?: never;
326
+ post?: never;
327
+ delete?: never;
328
+ options?: never;
329
+ head?: never;
330
+ patch?: never;
331
+ trace?: never;
332
+ };
333
+ "/api/v1/consent-status": {
334
+ parameters: {
335
+ query?: never;
336
+ header?: never;
337
+ path?: never;
338
+ cookie?: never;
339
+ };
340
+ /**
341
+ * Look up an org's per-purpose consent state by email (docs/specs/ecommerce-cms-plugins.md, §4).
342
+ * @description Read-only: a WooCommerce/Shopify plugin's only fact about a customer is an email address from its own storefront — every other consent-reading route requires a dpdpbot-internal consent id or a brokered principal token. This resolves an email to the calling organization's own current per-purpose consent grants, so a plugin can gate a marketing sync in real time. `found: false` (not a 404) means the identifier is not yet a customer of record for this organization — distinct from "known, with no active consent", which is `found: true` and an empty or all-opted-out `purposes` array. Requires the `dpdp_consent_status_lookup_enabled` flag; while it is off, this route behaves as if it doesn't exist (404). Write access to consent stays `POST`/`DELETE /cm/v1/consent` — there is no corresponding write route here (ADR-007 D3).
343
+ */
344
+ get: operations["getConsentStatus"];
345
+ put?: never;
346
+ post?: never;
347
+ delete?: never;
348
+ options?: never;
349
+ head?: never;
350
+ patch?: never;
351
+ trace?: never;
352
+ };
353
+ "/api/v1/breaches": {
354
+ parameters: {
355
+ query?: never;
356
+ header?: never;
357
+ path?: never;
358
+ cookie?: never;
359
+ };
360
+ /**
361
+ * List the organization's breach register (docs/specs/crm-backend-integration-blockers.md, B1).
362
+ * @description Read-only: returns the organization's breach register (s.8(6)), so a fiduciary's server integration can trigger its own containment-erasure automation off a reported breach instead of a human watching the dpdpbot dashboard. Simulated breaches from the Breach Drill Simulator are excluded. Requires the `dpdp_breach_register_api_enabled` flag; while it is off, this route behaves as if it doesn't exist (404). Write access to the breach register stays dashboard-only (ADR-007 D3) — there is no corresponding write route.
363
+ */
364
+ get: operations["listBreaches"];
365
+ put?: never;
366
+ post?: never;
367
+ delete?: never;
368
+ options?: never;
369
+ head?: never;
370
+ patch?: never;
371
+ trace?: never;
372
+ };
373
+ "/api/v1/consent/verify": {
374
+ parameters: {
375
+ query?: never;
376
+ header?: never;
377
+ path?: never;
378
+ cookie?: never;
379
+ };
380
+ get?: never;
381
+ put?: never;
382
+ /**
383
+ * Check whether a consent may still be acted on (research/2026-08-04-dpdp-research.md, Idea P3 "Consent Gate").
384
+ * @description Read-only stop-processing enforcement: a fiduciary's backend calls
385
+ * this immediately before acting on a principal's data and gets back an
386
+ * allow/deny decision derived from the consent record's own
387
+ * `withdrawnAt` state, rather than trusting whatever consent state its
388
+ * own pipeline cached locally.
389
+ *
390
+ * Authenticated with the same org-scoped `apiKey` service credential as
391
+ * `/api/v1/breaches` and `/cm/v1/consent` (ADR-004 D2). A consent that
392
+ * belongs to another organization is reported as `404`, not `403`, so
393
+ * the endpoint cannot be used to probe for consent ids outside the
394
+ * calling key's org.
395
+ *
396
+ * Withdrawal itself stays `DELETE /cm/v1/consent/{consentId}`'s job —
397
+ * this route never mutates the consent record. It may append an
398
+ * immutable decision row to the org's Consent Gate audit log when
399
+ * `dpdp_consent_gate_decision_audit_enabled` is on; that log is read
400
+ * from the dashboard, not from this API.
401
+ *
402
+ * Requires the `dpdp_consent_gate_api_enabled` flag; while it is off,
403
+ * this route behaves as if it doesn't exist (404).
404
+ */
405
+ post: operations["verifyConsentGate"];
406
+ delete?: never;
407
+ options?: never;
408
+ head?: never;
409
+ patch?: never;
410
+ trace?: never;
411
+ };
412
+ "/api/v1/consent/gate/decisions": {
413
+ parameters: {
414
+ query?: never;
415
+ header?: never;
416
+ path?: never;
417
+ cookie?: never;
418
+ };
419
+ /**
420
+ * Read the organization's Consent Gate decision audit log (research/2026-08-04-dpdp-research.md, Idea P3 "Consent Gate").
421
+ * @description Read-only: returns the immutable allow/deny decisions recorded for
422
+ * the calling key's organization by `POST /api/v1/consent/verify`,
423
+ * newest first, so a fiduciary's SIEM or on-call tooling can ingest
424
+ * them instead of a human reading them off the dashboard.
425
+ *
426
+ * Authenticated with the same org-scoped `apiKey` service credential
427
+ * as `/api/v1/consent/verify` itself (ADR-004 D2) — an integration
428
+ * that already calls the gate needs no new credential to read back
429
+ * what it was told. The log is append-only: `verifyForApiKey` is the
430
+ * only writer and there is no corresponding write route (ADR-007 D3).
431
+ *
432
+ * Requires the `dpdp_consent_gate_audit_api_enabled` flag; while it is
433
+ * off, this route behaves as if it doesn't exist (404). That flag is
434
+ * *transport* only and is not a way around
435
+ * `dpdp_consent_gate_decision_audit_enabled`, which gates the
436
+ * recording itself — while that flag is off nothing is written, so
437
+ * this route returns an empty `decisions` array rather than an error.
438
+ */
439
+ get: operations["listConsentGateDecisions"];
440
+ put?: never;
441
+ post?: never;
442
+ delete?: never;
443
+ options?: never;
444
+ head?: never;
445
+ patch?: never;
446
+ trace?: never;
447
+ };
448
+ "/api/v1/consent/gate/alerts": {
449
+ parameters: {
450
+ query?: never;
451
+ header?: never;
452
+ path?: never;
453
+ cookie?: never;
454
+ };
455
+ /**
456
+ * Read the organization's Consent Gate bypass alerts (research/2026-08-04-dpdp-research.md, Idea P3 "Consent Gate").
457
+ * @description Read-only: returns the consents that look like a bypass attempt —
458
+ * one that has been denied `denyThreshold` or more times inside the
459
+ * rolling `windowMs` window. A single deny is the gate working as
460
+ * intended; a cluster of denies against the same consent is an
461
+ * integration that keeps asking, or keeps acting regardless of the
462
+ * answer, instead of respecting the first "stop".
463
+ *
464
+ * `windowMs` and `denyThreshold` are echoed back on every response,
465
+ * including an empty one, so a caller can tell what "no alerts" was
466
+ * measured against instead of hard-coding the heuristic's constants.
467
+ *
468
+ * Authenticated with the same org-scoped `apiKey` service credential
469
+ * as `/api/v1/consent/verify` (ADR-004 D2). Derived entirely from the
470
+ * decision log — it stores nothing of its own and mutates nothing.
471
+ *
472
+ * Requires the `dpdp_consent_gate_audit_api_enabled` flag; while it is
473
+ * off, this route behaves as if it doesn't exist (404). That flag is
474
+ * *transport* only and is not a way around
475
+ * `dpdp_consent_gate_bypass_alerts_enabled`, which gates the detection
476
+ * itself — while that flag is off this route returns an empty `alerts`
477
+ * array (with `windowMs`/`denyThreshold` still populated) rather than
478
+ * an error.
479
+ */
480
+ get: operations["listConsentGateBypassAlerts"];
481
+ put?: never;
482
+ post?: never;
483
+ delete?: never;
484
+ options?: never;
485
+ head?: never;
486
+ patch?: never;
487
+ trace?: never;
488
+ };
489
+ "/api/v1/cross-border/transfers": {
490
+ parameters: {
491
+ query?: never;
492
+ header?: never;
493
+ path?: never;
494
+ cookie?: never;
495
+ };
496
+ /**
497
+ * List the organization's cross-border transfer register (docs/specs/crm-backend-integration-blockers.md, B1).
498
+ * @description Read-only: returns the organization's RoPA (`processingActivities`) entries declared as crossing borders (s.16), so a fiduciary's server integration can act on that register programmatically instead of a human reading it off the RoPA Builder dashboard. Archived activities are excluded. Requires the `dpdp_cross_border_transfers_api_enabled` flag; while it is off, this route behaves as if it doesn't exist (404). Write access to the RoPA stays dashboard-only (ADR-007 D3) — there is no corresponding write route.
499
+ */
500
+ get: operations["listCrossBorderTransfers"];
501
+ put?: never;
502
+ post?: never;
503
+ delete?: never;
504
+ options?: never;
505
+ head?: never;
506
+ patch?: never;
507
+ trace?: never;
508
+ };
509
+ "/api/v1/offline-consent/links": {
510
+ parameters: {
511
+ query?: never;
512
+ header?: never;
513
+ path?: never;
514
+ cookie?: never;
515
+ };
516
+ get?: never;
517
+ put?: never;
518
+ /**
519
+ * Generate an offline/QR consent link (docs/specs/offline-consent-capture.md, Problem Statement gap 6 — "no integration surface").
520
+ * @description Creates the same `offlineConsentLinks` row the dashboard's "Offline consent link" generator does, so a fiduciary's server integration (HIS, POS terminal, CBS) can mint one without a human using the React admin page. The returned `token` resolves at `/offline-consent/{token}` on the fiduciary's own dpdpbot app origin — turn that URL into a QR code for a branch counter, agent desk, or POS terminal. Requires the `dpdp_offline_consent_link_api_enabled` flag; while it is off, this route behaves as if it doesn't exist (404). The link is only redeemable once `dpdp_offline_consent_bridge_enabled` is also on.
521
+ */
522
+ post: operations["createOfflineConsentLink"];
523
+ delete?: never;
524
+ options?: never;
525
+ head?: never;
526
+ patch?: never;
527
+ trace?: never;
528
+ };
529
+ "/api/v1/offline/captures": {
530
+ parameters: {
531
+ query?: never;
532
+ header?: never;
533
+ path?: never;
534
+ cookie?: never;
535
+ };
536
+ get?: never;
537
+ put?: never;
538
+ /**
539
+ * Sync a batch of offline capture sessions (docs/specs/offline-consent-capture.md 4.4).
540
+ * @description An enrolled field device — or the HIS/CBS/POS server fronting a fleet of them — pushes queued capture sessions here when connectivity returns. Each session carries an ECDSA P-256 signature produced in the device's secure element over the canonical string defined in `conformance/audit-hash-spec.md` (Cryptographic Consent Artifact); the server recomputes that string and verifies it against the enrolled `agentDevices` public key.
541
+ *
542
+ * Every session is processed independently, so **partial success is normal**: one forged or stale session never fails the others in the batch. `clientSessionId` is the idempotency key — replaying a batch that already committed returns the original per-session results and writes nothing. A session that fails verification is *quarantined* with a reason and retained as evidence, never silently dropped and never silently accepted. Requires the `dpdp_offline_agent_capture_enabled` flag; 404s while it is off.
543
+ */
544
+ post: operations["syncOfflineCaptures"];
545
+ delete?: never;
546
+ options?: never;
547
+ head?: never;
548
+ patch?: never;
549
+ trace?: never;
550
+ };
551
+ "/api/v1/offline/pos": {
552
+ parameters: {
553
+ query?: never;
554
+ header?: never;
555
+ path?: never;
556
+ cookie?: never;
557
+ };
558
+ get?: never;
559
+ put?: never;
560
+ /**
561
+ * Raise an asynchronous consent request from a POS terminal (docs/specs/offline-consent-capture.md 6.4).
562
+ * @description Called by a till when a phone number is keyed in. Returns immediately with a token the receipt can render as a short link or QR code; the customer reviews the notice and confirms on their own device afterwards at `/consent/{token}`.
563
+ *
564
+ * **The response is not a consent.** No `consents` row exists until the principal affirmatively confirms — processing must not begin on the strength of a raised request. Unanswered requests expire after 72 hours into the fiduciary's DPO queue. The submitted `phone` is HMAC'd per-organization before storage and is never persisted in the clear. Requires the `dpdp_offline_async_consent_enabled` flag.
565
+ */
566
+ post: operations["createPosConsentRequest"];
567
+ delete?: never;
568
+ options?: never;
569
+ head?: never;
570
+ patch?: never;
571
+ trace?: never;
572
+ };
573
+ "/api/v1/offline/ivr": {
574
+ parameters: {
575
+ query?: never;
576
+ header?: never;
577
+ path?: never;
578
+ cookie?: never;
579
+ };
580
+ get?: never;
581
+ put?: never;
582
+ /**
583
+ * Submit the artefact of a completed IVR consent call (docs/specs/offline-consent-capture.md 6.3).
584
+ * @description dpdpbot defines this adapter contract but does not build telephony. A partner gateway posts what a completed call produced; the **audio recording is the affirmative-action evidence**, so `audioRecordingUri` is required — a DTMF digit alone proves a key was pressed, not that a notice was read out first.
585
+ *
586
+ * A `dtmfSequence` beginning with `1` is treated as acceptance and materialises an audited `consents` row with `source: offline_ivr`; anything else records the artefact without creating a consent, so a refusal is retained as evidence rather than discarded. `partnerSignature` is stored verbatim as an assertion of origin — dpdpbot cannot verify a key it does not hold and does not claim to. Requires the `dpdp_offline_async_consent_enabled` flag.
587
+ */
588
+ post: operations["recordIvrConsentArtifact"];
589
+ delete?: never;
590
+ options?: never;
591
+ head?: never;
592
+ patch?: never;
593
+ trace?: never;
594
+ };
595
+ "/api/v1/staff/dsr": {
596
+ parameters: {
597
+ query?: never;
598
+ header?: never;
599
+ path?: never;
600
+ cookie?: never;
601
+ };
602
+ /**
603
+ * List an organization's DSR requests (fiduciary/DPO dashboard mobile surface).
604
+ * @description Authenticated with the fiduciary/DPO staff's own login session — not a brokered principal token, since staff already have their own credentials.
605
+ */
606
+ get: operations["staffListDsrRequests"];
607
+ put?: never;
608
+ post?: never;
609
+ delete?: never;
610
+ options?: never;
611
+ head?: never;
612
+ patch?: never;
613
+ trace?: never;
614
+ };
615
+ "/api/v1/staff/dsr/statutory-basis-suggestions": {
616
+ parameters: {
617
+ query?: never;
618
+ header?: never;
619
+ path?: never;
620
+ cookie?: never;
621
+ };
622
+ /** Pre-built statutory citation suggestions for statutory denial. */
623
+ get: operations["staffListStatutoryBasisSuggestions"];
624
+ put?: never;
625
+ post?: never;
626
+ delete?: never;
627
+ options?: never;
628
+ head?: never;
629
+ patch?: never;
630
+ trace?: never;
631
+ };
632
+ "/api/v1/staff/dsr/{requestId}": {
633
+ parameters: {
634
+ query?: never;
635
+ header?: never;
636
+ path?: never;
637
+ cookie?: never;
638
+ };
639
+ get?: never;
640
+ put?: never;
641
+ post?: never;
642
+ delete?: never;
643
+ options?: never;
644
+ head?: never;
645
+ /** Update a DSR request's status (forward-only state machine). */
646
+ patch: operations["staffUpdateDsrStatus"];
647
+ trace?: never;
648
+ };
649
+ "/api/v1/staff/dsr/{requestId}/summary": {
650
+ parameters: {
651
+ query?: never;
652
+ header?: never;
653
+ path?: never;
654
+ cookie?: never;
655
+ };
656
+ get?: never;
657
+ put?: never;
658
+ /** Auto-generate the summary response for a "summary"-type DSR. */
659
+ post: operations["staffGenerateDsrSummary"];
660
+ delete?: never;
661
+ options?: never;
662
+ head?: never;
663
+ patch?: never;
664
+ trace?: never;
665
+ };
666
+ "/api/v1/staff/dsr/{requestId}/statutory-denial": {
667
+ parameters: {
668
+ query?: never;
669
+ header?: never;
670
+ path?: never;
671
+ cookie?: never;
672
+ };
673
+ get?: never;
674
+ put?: never;
675
+ /**
676
+ * Deny an erasure request on a documented statutory basis.
677
+ * @description Requires the `dpdp_dsr_statutory_denial_enabled` flag.
678
+ */
679
+ post: operations["staffRejectDsrWithStatutoryBasis"];
680
+ delete?: never;
681
+ options?: never;
682
+ head?: never;
683
+ patch?: never;
684
+ trace?: never;
685
+ };
686
+ "/api/v1/staff/grievances": {
687
+ parameters: {
688
+ query?: never;
689
+ header?: never;
690
+ path?: never;
691
+ cookie?: never;
692
+ };
693
+ /** List an organization's grievances (fiduciary/DPO dashboard mobile surface). */
694
+ get: operations["staffListGrievances"];
695
+ put?: never;
696
+ post?: never;
697
+ delete?: never;
698
+ options?: never;
699
+ head?: never;
700
+ patch?: never;
701
+ trace?: never;
702
+ };
703
+ "/api/v1/staff/grievances/{grievanceId}/respond": {
704
+ parameters: {
705
+ query?: never;
706
+ header?: never;
707
+ path?: never;
708
+ cookie?: never;
709
+ };
710
+ get?: never;
711
+ put?: never;
712
+ /** Respond to and close out a grievance. */
713
+ post: operations["staffRespondToGrievance"];
714
+ delete?: never;
715
+ options?: never;
716
+ head?: never;
717
+ patch?: never;
718
+ trace?: never;
719
+ };
720
+ }
721
+ export type webhooks = Record<string, never>;
722
+ export interface components {
723
+ schemas: {
724
+ ApiError: {
725
+ /** @description Stable, machine-readable error code. */
726
+ code: string;
727
+ /** @description Human-readable message. */
728
+ error: string;
729
+ };
730
+ OrgSummary: {
731
+ orgId: string;
732
+ name: string;
733
+ slug: string;
734
+ };
735
+ Notice: {
736
+ _id: string;
737
+ organizationId: string;
738
+ version: number;
739
+ itemized: {
740
+ purpose: string;
741
+ personalDataDescription: string;
742
+ }[];
743
+ /** @description Map of language code to `{ title, body }`. */
744
+ content: Record<string, never>;
745
+ /** @enum {string} */
746
+ status: "draft" | "published";
747
+ };
748
+ DsrRequest: {
749
+ requestId: string;
750
+ /** @enum {string} */
751
+ type: "summary" | "processors" | "correction" | "erasure";
752
+ /** @enum {string} */
753
+ status: "pending" | "in_progress" | "completed" | "rejected";
754
+ /** @description SLA deadline, Unix epoch milliseconds. */
755
+ dueAt?: number;
756
+ requestDetails?: string;
757
+ };
758
+ Grievance: {
759
+ grievanceId: string;
760
+ subject: string;
761
+ description: string;
762
+ /** @enum {string} */
763
+ status: "open" | "in_progress" | "resolved";
764
+ /** @description SLA deadline, Unix epoch milliseconds. */
765
+ dueAt: number;
766
+ respondedAt?: number;
767
+ response?: string;
768
+ };
769
+ WidgetConfig: {
770
+ organizationId: string;
771
+ noticeId: string;
772
+ notice: {
773
+ /** @description Map of language code to `{ title, body }`. */
774
+ content: Record<string, never>;
775
+ itemized: {
776
+ purpose: string;
777
+ personalDataDescription: string;
778
+ }[];
779
+ };
780
+ /** @description Present only if the domain group has customized banner styling. */
781
+ bannerSettings?: Record<string, never>;
782
+ };
783
+ /** @description One immutable row of the Consent Gate decision audit log, written by `POST /api/v1/consent/verify` while `dpdp_consent_gate_decision_audit_enabled` is on. */
784
+ ConsentGateDecision: {
785
+ /** @description Stable id for this decision row — usable as a de-duplication key when tailing the log. */
786
+ decisionId: string;
787
+ /** @description The consent record the decision was made about. */
788
+ consentId: string;
789
+ /** @description Which of the organization's own service API keys asked. Lets a fiduciary attribute a decision to one of its integrations. */
790
+ apiKeyId: string;
791
+ /** @enum {string} */
792
+ decision: "allow" | "deny";
793
+ /** @enum {string} */
794
+ reason: "consent_active" | "consent_withdrawn";
795
+ /** @description Epoch ms the decision was made. */
796
+ decidedAt: number;
797
+ };
798
+ /** @description A consent denied repeatedly inside the rolling window — the "shall generate alerts" half of "any bypass attempt shall generate alerts and immutable audit records". Derived from `ConsentGateDecision` rows; nothing separate is stored. */
799
+ ConsentGateBypassAlert: {
800
+ consentId: string;
801
+ /** @description In-window denies against this consent. */
802
+ denyCount: number;
803
+ /** @description Epoch ms of the earliest in-window deny. */
804
+ firstDeniedAt: number;
805
+ /** @description Epoch ms of the most recent in-window deny. */
806
+ lastDeniedAt: number;
807
+ };
808
+ CmSignalRecord: {
809
+ /** Format: uri */
810
+ "@context": string;
811
+ signalId: string;
812
+ cmRegistryId: string;
813
+ cmName: string;
814
+ principalTokenFromCm: string;
815
+ purposes: string[];
816
+ /** @enum {string} */
817
+ signalType: "consent_given" | "consent_withdrawn" | "consent_updated";
818
+ /** @description Unix epoch milliseconds. */
819
+ receivedAt: number;
820
+ /** @enum {string} */
821
+ mappingStatus: "mapped" | "unresolved" | "duplicate";
822
+ };
823
+ Nomination: {
824
+ nominationId: string;
825
+ nomineeName: string;
826
+ nomineeContact: string;
827
+ /** @enum {string} */
828
+ status: "active" | "revoked";
829
+ };
830
+ CreateOfflineConsentLinkRequest: {
831
+ /** @description Convex document id of a *published* `notices` row. */
832
+ noticeId: string;
833
+ purpose: string;
834
+ dataTypes: string[];
835
+ /** @description Free-text identifier for where this link/QR code is deployed (e.g. "Mumbai Branch — Counter 3"). Shown back to staff only, never to the data principal. */
836
+ label?: string;
837
+ };
838
+ OfflineConsentLink: {
839
+ linkId: string;
840
+ /** @description Opaque token that resolves at `/offline-consent/{token}` on the fiduciary's own dpdpbot app origin. */
841
+ token: string;
842
+ };
843
+ /** @description One physical consent interaction, created on an enrolled device and replayed on sync (docs/specs/offline-consent-capture.md 2.2). Signed on-device; see `conformance/capture-artifact-vectors.json` for the canonicalisation an SDK must reproduce byte-for-byte. */
844
+ OfflineCaptureSession: {
845
+ /** @description Client-generated UUIDv4 and the idempotency key. Re-syncing a session that already committed is a no-op. */
846
+ clientSessionId: string;
847
+ /** @description The enrolled `agentDevices` row whose key signed this. */
848
+ deviceId: string;
849
+ noticeId: string;
850
+ /** @description Quarantined as `notice_superseded` if the notice has since moved on — a consent must not rest on text the principal never saw. */
851
+ noticeVersion: number;
852
+ /** @description Eighth Schedule locale actually rendered. Inside the signature, because s. 5(3) evidence is about which language was read. */
853
+ noticeLocale: string;
854
+ /** @enum {string} */
855
+ channel: "qr" | "agent_app" | "pos" | "async_link" | "ivr";
856
+ /** @description Device clock at capture. Recorded verbatim but never used for arithmetic; skew beyond 7 days quarantines as `clock_skew`. */
857
+ capturedAtClient: number;
858
+ /** @description base64 of the raw IEEE-P1363 r||s ECDSA P-256 signature. */
859
+ deviceSignature: string;
860
+ dataTypes: string[];
861
+ /** @description Every purpose the principal was *shown*, opted in or out. Declined purposes are submitted too: proving someone was shown marketing and refused is what distinguishes granular consent from a notice that quietly omitted it. */
862
+ purposeGrants: {
863
+ purposeKey: string;
864
+ purposeLabel: string;
865
+ /** @enum {string} */
866
+ category: "essential" | "non_essential";
867
+ /** @enum {string} */
868
+ status: "opt_in" | "opt_out";
869
+ }[];
870
+ /** @description The identity handle the principal can later withdraw by. Signed raw; a `phone_hash` value is HMAC'd per-organization server-side and the raw number is never persisted. */
871
+ principalHandle?: {
872
+ /** @enum {string} */
873
+ kind: "phone_hash" | "uhid" | "cbs_ref" | "none";
874
+ value: string;
875
+ };
876
+ /** @description Set for QR-originated captures only. */
877
+ linkId?: string;
878
+ };
879
+ OfflineCaptureResult: {
880
+ clientSessionId: string;
881
+ /** @enum {string} */
882
+ status: "verified" | "quarantined" | "rejected";
883
+ consentId?: string;
884
+ /** @description Present for a non-verified session — `unknown_device`, `device_revoked`, `signature_mismatch`, `clock_skew`, `notice_unpublished`, `notice_superseded`, or `invalid_session`. */
885
+ reason?: string;
886
+ /** @description Present when a consent receipt was issued. Hand this to the principal (printed slip or read out) — it is what makes the consent withdrawable under s. 6(4). */
887
+ withdrawalToken?: string;
888
+ };
889
+ IvrConsentArtifact: {
890
+ noticeId: string;
891
+ /** @description The partner's identifier for the call, and the idempotency key for this submission. Gateways retry on timeout as a matter of course; a resubmission with the same `partnerCallId` returns the original artefact rather than materialising a second consent for one conversation. */
892
+ partnerCallId: string;
893
+ /** @description Required. The recording is the affirmative-action evidence and is stored as an immutable artefact. */
894
+ audioRecordingUri: string;
895
+ transcript?: string;
896
+ /** @description Rejected if the notice has no content for this locale. */
897
+ locale: string;
898
+ /** @description A sequence beginning with `1` is acceptance; anything else is a refusal. */
899
+ dtmfSequence: string;
900
+ /** @description Hashed by the partner; dpdpbot never receives the number. */
901
+ callerNumberHash: string;
902
+ capturedAt: number;
903
+ /** @description Retained verbatim as an assertion of origin. dpdpbot does not hold the partner's key and does not claim to verify it. */
904
+ partnerSignature: string;
905
+ purpose: string;
906
+ dataTypes: string[];
907
+ };
908
+ RecordConsentRequest: {
909
+ /**
910
+ * Format: email
911
+ * @description Identifies the existing `userProfiles` row to consent on behalf of.
912
+ */
913
+ email: string;
914
+ /** @description Convex document id of a *published* `notices` row. */
915
+ noticeId: string;
916
+ purpose: string;
917
+ dataTypes: string[];
918
+ };
919
+ ConsentRecord: {
920
+ /**
921
+ * Format: uri
922
+ * @description JSON-LD context for this consent-record representation.
923
+ */
924
+ "@context": string;
925
+ consentId: string;
926
+ purpose: string;
927
+ dataTypes: string[];
928
+ /** @description Unix epoch milliseconds. */
929
+ givenAt: number;
930
+ /** @description Unix epoch milliseconds, or null while still active. */
931
+ withdrawnAt: number | null;
932
+ /** @enum {string} */
933
+ status: "active" | "withdrawn";
934
+ };
935
+ Error: {
936
+ /** @description Free-text message. Not yet a stable machine-readable code — see the "Known gap" note in the top-level description. */
937
+ error: string;
938
+ };
939
+ };
940
+ responses: never;
941
+ parameters: {
942
+ /** @description Convex document id of the `consents` row. */
943
+ ConsentId: string;
944
+ /** @description Convex document id of the `organizations` row. */
945
+ OrgId: string;
946
+ OrgSlug: string;
947
+ };
948
+ requestBodies: never;
949
+ headers: never;
950
+ pathItems: never;
951
+ }
952
+ export type $defs = Record<string, never>;
953
+ export interface operations {
954
+ recordConsent: {
955
+ parameters: {
956
+ query?: never;
957
+ header?: never;
958
+ path?: never;
959
+ cookie?: never;
960
+ };
961
+ requestBody: {
962
+ content: {
963
+ "application/json": components["schemas"]["RecordConsentRequest"];
964
+ };
965
+ };
966
+ responses: {
967
+ /** @description Consent recorded. */
968
+ 201: {
969
+ headers: {
970
+ [name: string]: unknown;
971
+ };
972
+ content: {
973
+ "application/json": components["schemas"]["ConsentRecord"];
974
+ };
975
+ };
976
+ /** @description Missing/invalid required fields, malformed JSON body, or the notice is not published. */
977
+ 400: {
978
+ headers: {
979
+ [name: string]: unknown;
980
+ };
981
+ content: {
982
+ "application/json": components["schemas"]["Error"];
983
+ };
984
+ };
985
+ /** @description Missing, invalid, or revoked API key. */
986
+ 401: {
987
+ headers: {
988
+ [name: string]: unknown;
989
+ };
990
+ content: {
991
+ "application/json": components["schemas"]["Error"];
992
+ };
993
+ };
994
+ /** @description Tracking consent blocked for a verified minor. */
995
+ 403: {
996
+ headers: {
997
+ [name: string]: unknown;
998
+ };
999
+ content: {
1000
+ "application/json": components["schemas"]["Error"];
1001
+ };
1002
+ };
1003
+ /** @description Notice not found (or belongs to a different organization), or no data principal matches the given email. Also returned for every request while the `dpdp_cm_api_enabled` flag is off. */
1004
+ 404: {
1005
+ headers: {
1006
+ [name: string]: unknown;
1007
+ };
1008
+ content: {
1009
+ "application/json": components["schemas"]["Error"];
1010
+ };
1011
+ };
1012
+ /** @description The data principal already has an active consent for this notice. */
1013
+ 409: {
1014
+ headers: {
1015
+ [name: string]: unknown;
1016
+ };
1017
+ content: {
1018
+ "application/json": components["schemas"]["Error"];
1019
+ };
1020
+ };
1021
+ };
1022
+ };
1023
+ getConsent: {
1024
+ parameters: {
1025
+ query?: never;
1026
+ header?: never;
1027
+ path: {
1028
+ /** @description Convex document id of the `consents` row. */
1029
+ consentId: components["parameters"]["ConsentId"];
1030
+ };
1031
+ cookie?: never;
1032
+ };
1033
+ requestBody?: never;
1034
+ responses: {
1035
+ /** @description The consent record. */
1036
+ 200: {
1037
+ headers: {
1038
+ [name: string]: unknown;
1039
+ };
1040
+ content: {
1041
+ "application/json": components["schemas"]["ConsentRecord"];
1042
+ };
1043
+ };
1044
+ /** @description The consent id is not a valid identifier. */
1045
+ 400: {
1046
+ headers: {
1047
+ [name: string]: unknown;
1048
+ };
1049
+ content: {
1050
+ "application/json": components["schemas"]["Error"];
1051
+ };
1052
+ };
1053
+ /** @description Missing, invalid, or revoked API key. */
1054
+ 401: {
1055
+ headers: {
1056
+ [name: string]: unknown;
1057
+ };
1058
+ content: {
1059
+ "application/json": components["schemas"]["Error"];
1060
+ };
1061
+ };
1062
+ /** @description No such consent record, or it belongs to a different organization than the API key. Also returned for every request while the `dpdp_cm_api_enabled` flag is off. */
1063
+ 404: {
1064
+ headers: {
1065
+ [name: string]: unknown;
1066
+ };
1067
+ content: {
1068
+ "application/json": components["schemas"]["Error"];
1069
+ };
1070
+ };
1071
+ };
1072
+ };
1073
+ withdrawConsent: {
1074
+ parameters: {
1075
+ query?: never;
1076
+ header?: never;
1077
+ path: {
1078
+ /** @description Convex document id of the `consents` row. */
1079
+ consentId: components["parameters"]["ConsentId"];
1080
+ };
1081
+ cookie?: never;
1082
+ };
1083
+ requestBody?: never;
1084
+ responses: {
1085
+ /** @description The now-withdrawn consent record. */
1086
+ 200: {
1087
+ headers: {
1088
+ [name: string]: unknown;
1089
+ };
1090
+ content: {
1091
+ "application/json": components["schemas"]["ConsentRecord"];
1092
+ };
1093
+ };
1094
+ /** @description The consent id is not a valid identifier. */
1095
+ 400: {
1096
+ headers: {
1097
+ [name: string]: unknown;
1098
+ };
1099
+ content: {
1100
+ "application/json": components["schemas"]["Error"];
1101
+ };
1102
+ };
1103
+ /** @description Missing, invalid, or revoked API key. */
1104
+ 401: {
1105
+ headers: {
1106
+ [name: string]: unknown;
1107
+ };
1108
+ content: {
1109
+ "application/json": components["schemas"]["Error"];
1110
+ };
1111
+ };
1112
+ /** @description No such consent record, or it belongs to a different organization than the API key. Also returned for every request while the `dpdp_cm_api_enabled` flag is off. */
1113
+ 404: {
1114
+ headers: {
1115
+ [name: string]: unknown;
1116
+ };
1117
+ content: {
1118
+ "application/json": components["schemas"]["Error"];
1119
+ };
1120
+ };
1121
+ /** @description The consent is already withdrawn. */
1122
+ 409: {
1123
+ headers: {
1124
+ [name: string]: unknown;
1125
+ };
1126
+ content: {
1127
+ "application/json": components["schemas"]["Error"];
1128
+ };
1129
+ };
1130
+ };
1131
+ };
1132
+ getOrgBySlug: {
1133
+ parameters: {
1134
+ query?: never;
1135
+ header?: never;
1136
+ path: {
1137
+ slug: components["parameters"]["OrgSlug"];
1138
+ };
1139
+ cookie?: never;
1140
+ };
1141
+ requestBody?: never;
1142
+ responses: {
1143
+ /** @description The organization. */
1144
+ 200: {
1145
+ headers: {
1146
+ [name: string]: unknown;
1147
+ };
1148
+ content: {
1149
+ "application/json": components["schemas"]["OrgSummary"];
1150
+ };
1151
+ };
1152
+ /** @description No organization matches this slug, or the flag is off. */
1153
+ 404: {
1154
+ headers: {
1155
+ [name: string]: unknown;
1156
+ };
1157
+ content: {
1158
+ "application/json": components["schemas"]["ApiError"];
1159
+ };
1160
+ };
1161
+ };
1162
+ };
1163
+ getNoticesForOrg: {
1164
+ parameters: {
1165
+ query?: never;
1166
+ header?: never;
1167
+ path: {
1168
+ /** @description Convex document id of the `organizations` row. */
1169
+ orgId: components["parameters"]["OrgId"];
1170
+ };
1171
+ cookie?: never;
1172
+ };
1173
+ requestBody?: never;
1174
+ responses: {
1175
+ /** @description Published notices. */
1176
+ 200: {
1177
+ headers: {
1178
+ [name: string]: unknown;
1179
+ };
1180
+ content: {
1181
+ "application/json": {
1182
+ notices: components["schemas"]["Notice"][];
1183
+ };
1184
+ };
1185
+ };
1186
+ /** @description orgId is not a valid identifier. */
1187
+ 400: {
1188
+ headers: {
1189
+ [name: string]: unknown;
1190
+ };
1191
+ content: {
1192
+ "application/json": components["schemas"]["ApiError"];
1193
+ };
1194
+ };
1195
+ };
1196
+ };
1197
+ getNoticeById: {
1198
+ parameters: {
1199
+ query?: never;
1200
+ header?: never;
1201
+ path: {
1202
+ noticeId: string;
1203
+ };
1204
+ cookie?: never;
1205
+ };
1206
+ requestBody?: never;
1207
+ responses: {
1208
+ /** @description The notice. */
1209
+ 200: {
1210
+ headers: {
1211
+ [name: string]: unknown;
1212
+ };
1213
+ content: {
1214
+ "application/json": components["schemas"]["Notice"];
1215
+ };
1216
+ };
1217
+ /** @description No such notice, or the flag is off. */
1218
+ 404: {
1219
+ headers: {
1220
+ [name: string]: unknown;
1221
+ };
1222
+ content: {
1223
+ "application/json": components["schemas"]["ApiError"];
1224
+ };
1225
+ };
1226
+ };
1227
+ };
1228
+ getBannerConfig: {
1229
+ parameters: {
1230
+ query?: {
1231
+ domain?: string;
1232
+ appId?: string;
1233
+ };
1234
+ header?: never;
1235
+ path: {
1236
+ /** @description Convex document id of the `organizations` row. */
1237
+ orgId: components["parameters"]["OrgId"];
1238
+ };
1239
+ cookie?: never;
1240
+ };
1241
+ requestBody?: never;
1242
+ responses: {
1243
+ /** @description Resolved banner config. */
1244
+ 200: {
1245
+ headers: {
1246
+ [name: string]: unknown;
1247
+ };
1248
+ content: {
1249
+ "application/json": {
1250
+ bannerSettings?: Record<string, never>;
1251
+ configVersion: number;
1252
+ };
1253
+ };
1254
+ };
1255
+ /** @description The domain is not registered to this organization, or the flag is off. */
1256
+ 404: {
1257
+ headers: {
1258
+ [name: string]: unknown;
1259
+ };
1260
+ content: {
1261
+ "application/json": components["schemas"]["ApiError"];
1262
+ };
1263
+ };
1264
+ };
1265
+ };
1266
+ getWidgetConfig: {
1267
+ parameters: {
1268
+ query: {
1269
+ /** @description Convex document id of the `domainGroups` row (the widget script's `?id=`). */
1270
+ id: string;
1271
+ domain: string;
1272
+ };
1273
+ header?: never;
1274
+ path?: never;
1275
+ cookie?: never;
1276
+ };
1277
+ requestBody?: never;
1278
+ responses: {
1279
+ /** @description Resolved widget config. */
1280
+ 200: {
1281
+ headers: {
1282
+ [name: string]: unknown;
1283
+ };
1284
+ content: {
1285
+ "application/json": components["schemas"]["WidgetConfig"];
1286
+ };
1287
+ };
1288
+ /** @description Missing `id`/`domain` query params, or `id` is not a valid identifier. */
1289
+ 400: {
1290
+ headers: {
1291
+ [name: string]: unknown;
1292
+ };
1293
+ content: {
1294
+ "application/json": components["schemas"]["ApiError"];
1295
+ };
1296
+ };
1297
+ /** @description No matching domain group, the domain isn't registered to that group's organization, no notice resolves, or the `dpdp_mobile_api_enabled` flag is off. */
1298
+ 404: {
1299
+ headers: {
1300
+ [name: string]: unknown;
1301
+ };
1302
+ content: {
1303
+ "application/json": components["schemas"]["ApiError"];
1304
+ };
1305
+ };
1306
+ };
1307
+ };
1308
+ brokerToken: {
1309
+ parameters: {
1310
+ query?: never;
1311
+ header?: never;
1312
+ path?: never;
1313
+ cookie?: never;
1314
+ };
1315
+ requestBody: {
1316
+ content: {
1317
+ "application/json": {
1318
+ /** @description The fiduciary's own stable user id, org-scoped. */
1319
+ externalId: string;
1320
+ };
1321
+ };
1322
+ };
1323
+ responses: {
1324
+ /** @description Access token minted. */
1325
+ 201: {
1326
+ headers: {
1327
+ [name: string]: unknown;
1328
+ };
1329
+ content: {
1330
+ "application/json": {
1331
+ accessToken: string;
1332
+ expiresAt: number;
1333
+ /** @enum {string} */
1334
+ tokenType: "Bearer";
1335
+ };
1336
+ };
1337
+ };
1338
+ /** @description Missing externalId or invalid JSON body. */
1339
+ 400: {
1340
+ headers: {
1341
+ [name: string]: unknown;
1342
+ };
1343
+ content: {
1344
+ "application/json": components["schemas"]["ApiError"];
1345
+ };
1346
+ };
1347
+ /** @description Missing or invalid service API key. */
1348
+ 401: {
1349
+ headers: {
1350
+ [name: string]: unknown;
1351
+ };
1352
+ content: {
1353
+ "application/json": components["schemas"]["ApiError"];
1354
+ };
1355
+ };
1356
+ /** @description The `dpdp_mobile_api_enabled` flag is off. */
1357
+ 404: {
1358
+ headers: {
1359
+ [name: string]: unknown;
1360
+ };
1361
+ content: {
1362
+ "application/json": components["schemas"]["ApiError"];
1363
+ };
1364
+ };
1365
+ };
1366
+ };
1367
+ receiveCmSignal: {
1368
+ parameters: {
1369
+ query?: never;
1370
+ header?: never;
1371
+ path?: never;
1372
+ cookie?: never;
1373
+ };
1374
+ requestBody: {
1375
+ content: {
1376
+ "application/json": {
1377
+ /** @description The sending Consent Manager's registry id under MeitY's framework. */
1378
+ cmRegistryId: string;
1379
+ cmName: string;
1380
+ /** @description The CM's own opaque identifier for the Data Principal. Not yet mapped to a local `userProfile` — see the description above. */
1381
+ principalTokenFromCm: string;
1382
+ purposes: string[];
1383
+ /** @enum {string} */
1384
+ signalType: "consent_given" | "consent_withdrawn" | "consent_updated";
1385
+ };
1386
+ };
1387
+ };
1388
+ responses: {
1389
+ /** @description Signal recorded (or matched an existing duplicate delivery). */
1390
+ 201: {
1391
+ headers: {
1392
+ [name: string]: unknown;
1393
+ };
1394
+ content: {
1395
+ "application/json": components["schemas"]["CmSignalRecord"];
1396
+ };
1397
+ };
1398
+ /** @description Missing/invalid fields, or the JSON body is malformed. */
1399
+ 400: {
1400
+ headers: {
1401
+ [name: string]: unknown;
1402
+ };
1403
+ content: {
1404
+ "application/json": components["schemas"]["Error"];
1405
+ };
1406
+ };
1407
+ /** @description Missing or invalid API key. */
1408
+ 401: {
1409
+ headers: {
1410
+ [name: string]: unknown;
1411
+ };
1412
+ content: {
1413
+ "application/json": components["schemas"]["Error"];
1414
+ };
1415
+ };
1416
+ /** @description The `dpdp_cm_inbound_signals_enabled` flag is off. */
1417
+ 404: {
1418
+ headers: {
1419
+ [name: string]: unknown;
1420
+ };
1421
+ content: {
1422
+ "application/json": components["schemas"]["Error"];
1423
+ };
1424
+ };
1425
+ };
1426
+ };
1427
+ linkAnonymousConsent: {
1428
+ parameters: {
1429
+ query?: never;
1430
+ header?: never;
1431
+ path?: never;
1432
+ cookie?: never;
1433
+ };
1434
+ requestBody: {
1435
+ content: {
1436
+ "application/json": {
1437
+ anonymousId: string;
1438
+ };
1439
+ };
1440
+ };
1441
+ responses: {
1442
+ /** @description Reconciliation result. */
1443
+ 200: {
1444
+ headers: {
1445
+ [name: string]: unknown;
1446
+ };
1447
+ content: {
1448
+ "application/json": {
1449
+ linkedCount: number;
1450
+ needsReconsent: {
1451
+ noticeId: string;
1452
+ purpose: string;
1453
+ }[];
1454
+ };
1455
+ };
1456
+ };
1457
+ /** @description Missing anonymousId or invalid JSON body. */
1458
+ 400: {
1459
+ headers: {
1460
+ [name: string]: unknown;
1461
+ };
1462
+ content: {
1463
+ "application/json": components["schemas"]["ApiError"];
1464
+ };
1465
+ };
1466
+ /** @description Missing, invalid, or expired access token. */
1467
+ 401: {
1468
+ headers: {
1469
+ [name: string]: unknown;
1470
+ };
1471
+ content: {
1472
+ "application/json": components["schemas"]["ApiError"];
1473
+ };
1474
+ };
1475
+ };
1476
+ };
1477
+ giveConsentAnonymous: {
1478
+ parameters: {
1479
+ query?: never;
1480
+ header?: {
1481
+ "Idempotency-Key"?: string;
1482
+ };
1483
+ path?: never;
1484
+ cookie?: never;
1485
+ };
1486
+ requestBody: {
1487
+ content: {
1488
+ "application/json": {
1489
+ organizationId: string;
1490
+ noticeId: string;
1491
+ purpose: string;
1492
+ dataTypes: string[];
1493
+ anonymousId: string;
1494
+ };
1495
+ };
1496
+ };
1497
+ responses: {
1498
+ /** @description Consent recorded. */
1499
+ 201: {
1500
+ headers: {
1501
+ [name: string]: unknown;
1502
+ };
1503
+ content: {
1504
+ "application/json": {
1505
+ consentId: string;
1506
+ purpose: string;
1507
+ dataTypes: string[];
1508
+ givenAt: number;
1509
+ };
1510
+ };
1511
+ };
1512
+ /** @description Missing/invalid fields, rate limited, notice not published, or already consented. */
1513
+ 400: {
1514
+ headers: {
1515
+ [name: string]: unknown;
1516
+ };
1517
+ content: {
1518
+ "application/json": components["schemas"]["ApiError"];
1519
+ };
1520
+ };
1521
+ /** @description The `dpdp_mobile_api_enabled` flag is off. */
1522
+ 404: {
1523
+ headers: {
1524
+ [name: string]: unknown;
1525
+ };
1526
+ content: {
1527
+ "application/json": components["schemas"]["ApiError"];
1528
+ };
1529
+ };
1530
+ };
1531
+ };
1532
+ listDsrRequestsForCurrentUser: {
1533
+ parameters: {
1534
+ query?: never;
1535
+ header?: never;
1536
+ path?: never;
1537
+ cookie?: never;
1538
+ };
1539
+ requestBody?: never;
1540
+ responses: {
1541
+ /** @description The caller's own requests. */
1542
+ 200: {
1543
+ headers: {
1544
+ [name: string]: unknown;
1545
+ };
1546
+ content: {
1547
+ "application/json": {
1548
+ requests: components["schemas"]["DsrRequest"][];
1549
+ };
1550
+ };
1551
+ };
1552
+ /** @description Missing, invalid, or expired access token. */
1553
+ 401: {
1554
+ headers: {
1555
+ [name: string]: unknown;
1556
+ };
1557
+ content: {
1558
+ "application/json": components["schemas"]["ApiError"];
1559
+ };
1560
+ };
1561
+ /** @description The `dpdp_mobile_api_enabled` flag is off. */
1562
+ 404: {
1563
+ headers: {
1564
+ [name: string]: unknown;
1565
+ };
1566
+ content: {
1567
+ "application/json": components["schemas"]["ApiError"];
1568
+ };
1569
+ };
1570
+ };
1571
+ };
1572
+ createDsrRequest: {
1573
+ parameters: {
1574
+ query?: never;
1575
+ header?: {
1576
+ "Idempotency-Key"?: string;
1577
+ };
1578
+ path?: never;
1579
+ cookie?: never;
1580
+ };
1581
+ requestBody: {
1582
+ content: {
1583
+ "application/json": {
1584
+ organizationId: string;
1585
+ /** @enum {string} */
1586
+ type: "summary" | "processors" | "correction" | "erasure";
1587
+ details?: string;
1588
+ };
1589
+ };
1590
+ };
1591
+ responses: {
1592
+ /** @description Request filed. */
1593
+ 201: {
1594
+ headers: {
1595
+ [name: string]: unknown;
1596
+ };
1597
+ content: {
1598
+ "application/json": components["schemas"]["DsrRequest"];
1599
+ };
1600
+ };
1601
+ /** @description Missing/invalid fields, invalid type, or the principal isn't associated with the organization. */
1602
+ 400: {
1603
+ headers: {
1604
+ [name: string]: unknown;
1605
+ };
1606
+ content: {
1607
+ "application/json": components["schemas"]["ApiError"];
1608
+ };
1609
+ };
1610
+ /** @description Missing, invalid, or expired access token. */
1611
+ 401: {
1612
+ headers: {
1613
+ [name: string]: unknown;
1614
+ };
1615
+ content: {
1616
+ "application/json": components["schemas"]["ApiError"];
1617
+ };
1618
+ };
1619
+ /** @description The `dpdp_mobile_api_enabled` flag is off. */
1620
+ 404: {
1621
+ headers: {
1622
+ [name: string]: unknown;
1623
+ };
1624
+ content: {
1625
+ "application/json": components["schemas"]["ApiError"];
1626
+ };
1627
+ };
1628
+ };
1629
+ };
1630
+ listGrievancesForCurrentUser: {
1631
+ parameters: {
1632
+ query?: never;
1633
+ header?: never;
1634
+ path?: never;
1635
+ cookie?: never;
1636
+ };
1637
+ requestBody?: never;
1638
+ responses: {
1639
+ /** @description The caller's own grievances. */
1640
+ 200: {
1641
+ headers: {
1642
+ [name: string]: unknown;
1643
+ };
1644
+ content: {
1645
+ "application/json": {
1646
+ grievances: components["schemas"]["Grievance"][];
1647
+ };
1648
+ };
1649
+ };
1650
+ /** @description Missing, invalid, or expired access token. */
1651
+ 401: {
1652
+ headers: {
1653
+ [name: string]: unknown;
1654
+ };
1655
+ content: {
1656
+ "application/json": components["schemas"]["ApiError"];
1657
+ };
1658
+ };
1659
+ /** @description The `dpdp_mobile_api_enabled` flag is off. */
1660
+ 404: {
1661
+ headers: {
1662
+ [name: string]: unknown;
1663
+ };
1664
+ content: {
1665
+ "application/json": components["schemas"]["ApiError"];
1666
+ };
1667
+ };
1668
+ };
1669
+ };
1670
+ createGrievance: {
1671
+ parameters: {
1672
+ query?: never;
1673
+ header?: {
1674
+ "Idempotency-Key"?: string;
1675
+ };
1676
+ path?: never;
1677
+ cookie?: never;
1678
+ };
1679
+ requestBody: {
1680
+ content: {
1681
+ "application/json": {
1682
+ organizationId: string;
1683
+ subject: string;
1684
+ description: string;
1685
+ };
1686
+ };
1687
+ };
1688
+ responses: {
1689
+ /** @description Grievance filed. */
1690
+ 201: {
1691
+ headers: {
1692
+ [name: string]: unknown;
1693
+ };
1694
+ content: {
1695
+ "application/json": components["schemas"]["Grievance"];
1696
+ };
1697
+ };
1698
+ /** @description Missing/invalid fields, or the principal isn't associated with the organization. */
1699
+ 400: {
1700
+ headers: {
1701
+ [name: string]: unknown;
1702
+ };
1703
+ content: {
1704
+ "application/json": components["schemas"]["ApiError"];
1705
+ };
1706
+ };
1707
+ /** @description Missing, invalid, or expired access token. */
1708
+ 401: {
1709
+ headers: {
1710
+ [name: string]: unknown;
1711
+ };
1712
+ content: {
1713
+ "application/json": components["schemas"]["ApiError"];
1714
+ };
1715
+ };
1716
+ /** @description The `dpdp_mobile_api_enabled` flag is off. */
1717
+ 404: {
1718
+ headers: {
1719
+ [name: string]: unknown;
1720
+ };
1721
+ content: {
1722
+ "application/json": components["schemas"]["ApiError"];
1723
+ };
1724
+ };
1725
+ };
1726
+ };
1727
+ getNomination: {
1728
+ parameters: {
1729
+ query?: never;
1730
+ header?: never;
1731
+ path?: never;
1732
+ cookie?: never;
1733
+ };
1734
+ requestBody?: never;
1735
+ responses: {
1736
+ /** @description The active nomination, or null if none is set. */
1737
+ 200: {
1738
+ headers: {
1739
+ [name: string]: unknown;
1740
+ };
1741
+ content: {
1742
+ "application/json": components["schemas"]["Nomination"] | null;
1743
+ };
1744
+ };
1745
+ /** @description Missing, invalid, or expired access token. */
1746
+ 401: {
1747
+ headers: {
1748
+ [name: string]: unknown;
1749
+ };
1750
+ content: {
1751
+ "application/json": components["schemas"]["ApiError"];
1752
+ };
1753
+ };
1754
+ /** @description The `dpdp_mobile_api_enabled` flag is off. */
1755
+ 404: {
1756
+ headers: {
1757
+ [name: string]: unknown;
1758
+ };
1759
+ content: {
1760
+ "application/json": components["schemas"]["ApiError"];
1761
+ };
1762
+ };
1763
+ };
1764
+ };
1765
+ upsertNomination: {
1766
+ parameters: {
1767
+ query?: never;
1768
+ header?: never;
1769
+ path?: never;
1770
+ cookie?: never;
1771
+ };
1772
+ requestBody: {
1773
+ content: {
1774
+ "application/json": {
1775
+ nomineeName: string;
1776
+ nomineeContact: string;
1777
+ };
1778
+ };
1779
+ };
1780
+ responses: {
1781
+ /** @description The upserted nomination. */
1782
+ 200: {
1783
+ headers: {
1784
+ [name: string]: unknown;
1785
+ };
1786
+ content: {
1787
+ "application/json": components["schemas"]["Nomination"];
1788
+ };
1789
+ };
1790
+ /** @description Missing/invalid fields. */
1791
+ 400: {
1792
+ headers: {
1793
+ [name: string]: unknown;
1794
+ };
1795
+ content: {
1796
+ "application/json": components["schemas"]["ApiError"];
1797
+ };
1798
+ };
1799
+ /** @description Missing, invalid, or expired access token. */
1800
+ 401: {
1801
+ headers: {
1802
+ [name: string]: unknown;
1803
+ };
1804
+ content: {
1805
+ "application/json": components["schemas"]["ApiError"];
1806
+ };
1807
+ };
1808
+ /** @description The `dpdp_mobile_api_enabled` flag is off. */
1809
+ 404: {
1810
+ headers: {
1811
+ [name: string]: unknown;
1812
+ };
1813
+ content: {
1814
+ "application/json": components["schemas"]["ApiError"];
1815
+ };
1816
+ };
1817
+ };
1818
+ };
1819
+ revokeNomination: {
1820
+ parameters: {
1821
+ query?: never;
1822
+ header?: never;
1823
+ path?: never;
1824
+ cookie?: never;
1825
+ };
1826
+ requestBody?: never;
1827
+ responses: {
1828
+ /** @description Revoked (or already had none active). */
1829
+ 200: {
1830
+ headers: {
1831
+ [name: string]: unknown;
1832
+ };
1833
+ content: {
1834
+ "application/json": {
1835
+ revoked: boolean;
1836
+ };
1837
+ };
1838
+ };
1839
+ /** @description Missing, invalid, or expired access token. */
1840
+ 401: {
1841
+ headers: {
1842
+ [name: string]: unknown;
1843
+ };
1844
+ content: {
1845
+ "application/json": components["schemas"]["ApiError"];
1846
+ };
1847
+ };
1848
+ /** @description The `dpdp_mobile_api_enabled` flag is off. */
1849
+ 404: {
1850
+ headers: {
1851
+ [name: string]: unknown;
1852
+ };
1853
+ content: {
1854
+ "application/json": components["schemas"]["ApiError"];
1855
+ };
1856
+ };
1857
+ };
1858
+ };
1859
+ verifyParent: {
1860
+ parameters: {
1861
+ query?: never;
1862
+ header?: never;
1863
+ path?: never;
1864
+ cookie?: never;
1865
+ };
1866
+ requestBody: {
1867
+ content: {
1868
+ "application/json": {
1869
+ tokenFromProvider: string;
1870
+ };
1871
+ };
1872
+ };
1873
+ responses: {
1874
+ /** @description Verified. */
1875
+ 200: {
1876
+ headers: {
1877
+ [name: string]: unknown;
1878
+ };
1879
+ content: {
1880
+ "application/json": {
1881
+ /** @enum {string} */
1882
+ status: "ok";
1883
+ };
1884
+ };
1885
+ };
1886
+ /** @description Missing/invalid token, or the provider rejected it. */
1887
+ 400: {
1888
+ headers: {
1889
+ [name: string]: unknown;
1890
+ };
1891
+ content: {
1892
+ "application/json": components["schemas"]["ApiError"];
1893
+ };
1894
+ };
1895
+ /** @description Missing, invalid, or expired access token. */
1896
+ 401: {
1897
+ headers: {
1898
+ [name: string]: unknown;
1899
+ };
1900
+ content: {
1901
+ "application/json": components["schemas"]["ApiError"];
1902
+ };
1903
+ };
1904
+ /** @description The `dpdp_mobile_api_enabled` flag is off. */
1905
+ 404: {
1906
+ headers: {
1907
+ [name: string]: unknown;
1908
+ };
1909
+ content: {
1910
+ "application/json": components["schemas"]["ApiError"];
1911
+ };
1912
+ };
1913
+ };
1914
+ };
1915
+ listDueRetentions: {
1916
+ parameters: {
1917
+ query?: never;
1918
+ header?: never;
1919
+ path?: never;
1920
+ cookie?: never;
1921
+ };
1922
+ requestBody?: never;
1923
+ responses: {
1924
+ /** @description The calling key's organization's due retentions. */
1925
+ 200: {
1926
+ headers: {
1927
+ [name: string]: unknown;
1928
+ };
1929
+ content: {
1930
+ "application/json": {
1931
+ due: {
1932
+ scheduledErasureId: string;
1933
+ userId: string;
1934
+ /** @description Epoch ms the retention window elapsed. */
1935
+ scheduledFor: number;
1936
+ reason: string;
1937
+ preNotificationSentAt?: number;
1938
+ }[];
1939
+ };
1940
+ };
1941
+ };
1942
+ /** @description Missing or invalid API key. */
1943
+ 401: {
1944
+ headers: {
1945
+ [name: string]: unknown;
1946
+ };
1947
+ content: {
1948
+ "application/json": components["schemas"]["ApiError"];
1949
+ };
1950
+ };
1951
+ /** @description The `dpdp_retention_due_api_enabled` flag is off. */
1952
+ 404: {
1953
+ headers: {
1954
+ [name: string]: unknown;
1955
+ };
1956
+ content: {
1957
+ "application/json": components["schemas"]["ApiError"];
1958
+ };
1959
+ };
1960
+ };
1961
+ };
1962
+ getConsentStatus: {
1963
+ parameters: {
1964
+ query: {
1965
+ email: string;
1966
+ };
1967
+ header?: never;
1968
+ path?: never;
1969
+ cookie?: never;
1970
+ };
1971
+ requestBody?: never;
1972
+ responses: {
1973
+ /** @description The calling key's organization's consent status for this email. */
1974
+ 200: {
1975
+ headers: {
1976
+ [name: string]: unknown;
1977
+ };
1978
+ content: {
1979
+ "application/json": {
1980
+ identifier: string;
1981
+ /** @enum {string} */
1982
+ identifierType: "email";
1983
+ found: boolean;
1984
+ purposes: {
1985
+ purposeKey: string;
1986
+ /** @enum {string} */
1987
+ category: "essential" | "non_essential";
1988
+ /** @enum {string} */
1989
+ status: "opt_in" | "opt_out";
1990
+ /** @description Epoch ms this purpose was withdrawn, if any. */
1991
+ withdrawnAt?: number;
1992
+ }[];
1993
+ };
1994
+ };
1995
+ };
1996
+ /** @description Missing `email` query parameter. */
1997
+ 400: {
1998
+ headers: {
1999
+ [name: string]: unknown;
2000
+ };
2001
+ content: {
2002
+ "application/json": components["schemas"]["ApiError"];
2003
+ };
2004
+ };
2005
+ /** @description Missing or invalid API key. */
2006
+ 401: {
2007
+ headers: {
2008
+ [name: string]: unknown;
2009
+ };
2010
+ content: {
2011
+ "application/json": components["schemas"]["ApiError"];
2012
+ };
2013
+ };
2014
+ /** @description The `dpdp_consent_status_lookup_enabled` flag is off. */
2015
+ 404: {
2016
+ headers: {
2017
+ [name: string]: unknown;
2018
+ };
2019
+ content: {
2020
+ "application/json": components["schemas"]["ApiError"];
2021
+ };
2022
+ };
2023
+ };
2024
+ };
2025
+ listBreaches: {
2026
+ parameters: {
2027
+ query?: never;
2028
+ header?: never;
2029
+ path?: never;
2030
+ cookie?: never;
2031
+ };
2032
+ requestBody?: never;
2033
+ responses: {
2034
+ /** @description The calling key's organization's breach register. */
2035
+ 200: {
2036
+ headers: {
2037
+ [name: string]: unknown;
2038
+ };
2039
+ content: {
2040
+ "application/json": {
2041
+ breaches: {
2042
+ breachId: string;
2043
+ description: string;
2044
+ /** @description Epoch ms the breach was discovered. */
2045
+ discoveredAt: number;
2046
+ reportedToUserAt?: number;
2047
+ reportedToBoardAt?: number;
2048
+ detailedReportSubmittedAt?: number;
2049
+ certInReportSubmittedAt?: number;
2050
+ mitigation?: string;
2051
+ /** @enum {string} */
2052
+ status: "reported_user_pending" | "reported_user_done" | "reported_board_pending" | "reported_board_done";
2053
+ }[];
2054
+ };
2055
+ };
2056
+ };
2057
+ /** @description Missing or invalid API key. */
2058
+ 401: {
2059
+ headers: {
2060
+ [name: string]: unknown;
2061
+ };
2062
+ content: {
2063
+ "application/json": components["schemas"]["ApiError"];
2064
+ };
2065
+ };
2066
+ /** @description The `dpdp_breach_register_api_enabled` flag is off. */
2067
+ 404: {
2068
+ headers: {
2069
+ [name: string]: unknown;
2070
+ };
2071
+ content: {
2072
+ "application/json": components["schemas"]["ApiError"];
2073
+ };
2074
+ };
2075
+ };
2076
+ };
2077
+ verifyConsentGate: {
2078
+ parameters: {
2079
+ query?: never;
2080
+ header?: never;
2081
+ path?: never;
2082
+ cookie?: never;
2083
+ };
2084
+ requestBody: {
2085
+ content: {
2086
+ "application/json": {
2087
+ /** @description The consent record to evaluate. Must belong to the calling key's organization. */
2088
+ consentId: string;
2089
+ };
2090
+ };
2091
+ };
2092
+ responses: {
2093
+ /** @description The decision. `allow` means the consent is active; `deny` means it has been withdrawn and processing that depends on it must stop. */
2094
+ 200: {
2095
+ headers: {
2096
+ [name: string]: unknown;
2097
+ };
2098
+ content: {
2099
+ "application/json": {
2100
+ /** @enum {string} */
2101
+ decision: "allow" | "deny";
2102
+ /** @enum {string} */
2103
+ reason: "consent_active" | "consent_withdrawn";
2104
+ consentId: string;
2105
+ };
2106
+ };
2107
+ };
2108
+ /** @description Missing or malformed JSON body, a missing `consentId`, or a `consentId` that isn't a well-formed id. */
2109
+ 400: {
2110
+ headers: {
2111
+ [name: string]: unknown;
2112
+ };
2113
+ content: {
2114
+ "application/json": components["schemas"]["ApiError"];
2115
+ };
2116
+ };
2117
+ /** @description Missing, invalid, or revoked API key. */
2118
+ 401: {
2119
+ headers: {
2120
+ [name: string]: unknown;
2121
+ };
2122
+ content: {
2123
+ "application/json": components["schemas"]["ApiError"];
2124
+ };
2125
+ };
2126
+ /** @description The `dpdp_consent_gate_api_enabled` flag is off, or the consent does not exist or belongs to another organization. */
2127
+ 404: {
2128
+ headers: {
2129
+ [name: string]: unknown;
2130
+ };
2131
+ content: {
2132
+ "application/json": components["schemas"]["ApiError"];
2133
+ };
2134
+ };
2135
+ };
2136
+ };
2137
+ listConsentGateDecisions: {
2138
+ parameters: {
2139
+ query?: {
2140
+ /** @description How many decisions to return, newest first. Defaults to 50 and is clamped to 200. */
2141
+ limit?: number;
2142
+ };
2143
+ header?: never;
2144
+ path?: never;
2145
+ cookie?: never;
2146
+ };
2147
+ requestBody?: never;
2148
+ responses: {
2149
+ /** @description The calling key's organization's recorded Consent Gate decisions, newest first. */
2150
+ 200: {
2151
+ headers: {
2152
+ [name: string]: unknown;
2153
+ };
2154
+ content: {
2155
+ "application/json": {
2156
+ decisions: components["schemas"]["ConsentGateDecision"][];
2157
+ };
2158
+ };
2159
+ };
2160
+ /** @description A `limit` that isn't a positive integer. */
2161
+ 400: {
2162
+ headers: {
2163
+ [name: string]: unknown;
2164
+ };
2165
+ content: {
2166
+ "application/json": components["schemas"]["ApiError"];
2167
+ };
2168
+ };
2169
+ /** @description Missing, invalid, or revoked API key. */
2170
+ 401: {
2171
+ headers: {
2172
+ [name: string]: unknown;
2173
+ };
2174
+ content: {
2175
+ "application/json": components["schemas"]["ApiError"];
2176
+ };
2177
+ };
2178
+ /** @description The `dpdp_consent_gate_audit_api_enabled` flag is off. */
2179
+ 404: {
2180
+ headers: {
2181
+ [name: string]: unknown;
2182
+ };
2183
+ content: {
2184
+ "application/json": components["schemas"]["ApiError"];
2185
+ };
2186
+ };
2187
+ };
2188
+ };
2189
+ listConsentGateBypassAlerts: {
2190
+ parameters: {
2191
+ query?: never;
2192
+ header?: never;
2193
+ path?: never;
2194
+ cookie?: never;
2195
+ };
2196
+ requestBody?: never;
2197
+ responses: {
2198
+ /** @description The calling key's organization's candidate bypass attempts, most recently denied first. */
2199
+ 200: {
2200
+ headers: {
2201
+ [name: string]: unknown;
2202
+ };
2203
+ content: {
2204
+ "application/json": {
2205
+ alerts: components["schemas"]["ConsentGateBypassAlert"][];
2206
+ /** @description The rolling window, in milliseconds, a deny still counts toward an alert within. */
2207
+ windowMs: number;
2208
+ /** @description In-window denies against one consent that constitute an alert. */
2209
+ denyThreshold: number;
2210
+ };
2211
+ };
2212
+ };
2213
+ /** @description Missing, invalid, or revoked API key. */
2214
+ 401: {
2215
+ headers: {
2216
+ [name: string]: unknown;
2217
+ };
2218
+ content: {
2219
+ "application/json": components["schemas"]["ApiError"];
2220
+ };
2221
+ };
2222
+ /** @description The `dpdp_consent_gate_audit_api_enabled` flag is off. */
2223
+ 404: {
2224
+ headers: {
2225
+ [name: string]: unknown;
2226
+ };
2227
+ content: {
2228
+ "application/json": components["schemas"]["ApiError"];
2229
+ };
2230
+ };
2231
+ };
2232
+ };
2233
+ listCrossBorderTransfers: {
2234
+ parameters: {
2235
+ query?: never;
2236
+ header?: never;
2237
+ path?: never;
2238
+ cookie?: never;
2239
+ };
2240
+ requestBody?: never;
2241
+ responses: {
2242
+ /** @description The calling key's organization's active, cross-border-flagged RoPA entries. */
2243
+ 200: {
2244
+ headers: {
2245
+ [name: string]: unknown;
2246
+ };
2247
+ content: {
2248
+ "application/json": {
2249
+ transfers: {
2250
+ activityId: string;
2251
+ activityName: string;
2252
+ purpose: string;
2253
+ dataCategories: string[];
2254
+ /** @enum {string} */
2255
+ legalBasis: "consent" | "deemed_consent" | "legal_obligation" | "vital_interest" | "public_task";
2256
+ /** @description Epoch ms the RoPA entry was created. */
2257
+ createdAt: number;
2258
+ }[];
2259
+ };
2260
+ };
2261
+ };
2262
+ /** @description Missing or invalid API key. */
2263
+ 401: {
2264
+ headers: {
2265
+ [name: string]: unknown;
2266
+ };
2267
+ content: {
2268
+ "application/json": components["schemas"]["ApiError"];
2269
+ };
2270
+ };
2271
+ /** @description The `dpdp_cross_border_transfers_api_enabled` flag is off. */
2272
+ 404: {
2273
+ headers: {
2274
+ [name: string]: unknown;
2275
+ };
2276
+ content: {
2277
+ "application/json": components["schemas"]["ApiError"];
2278
+ };
2279
+ };
2280
+ };
2281
+ };
2282
+ createOfflineConsentLink: {
2283
+ parameters: {
2284
+ query?: never;
2285
+ header?: never;
2286
+ path?: never;
2287
+ cookie?: never;
2288
+ };
2289
+ requestBody: {
2290
+ content: {
2291
+ "application/json": components["schemas"]["CreateOfflineConsentLinkRequest"];
2292
+ };
2293
+ };
2294
+ responses: {
2295
+ /** @description Link created. */
2296
+ 201: {
2297
+ headers: {
2298
+ [name: string]: unknown;
2299
+ };
2300
+ content: {
2301
+ "application/json": components["schemas"]["OfflineConsentLink"];
2302
+ };
2303
+ };
2304
+ /** @description Missing/invalid required fields, malformed JSON body, or the notice is not published. */
2305
+ 400: {
2306
+ headers: {
2307
+ [name: string]: unknown;
2308
+ };
2309
+ content: {
2310
+ "application/json": components["schemas"]["ApiError"];
2311
+ };
2312
+ };
2313
+ /** @description Missing, invalid, or revoked API key. */
2314
+ 401: {
2315
+ headers: {
2316
+ [name: string]: unknown;
2317
+ };
2318
+ content: {
2319
+ "application/json": components["schemas"]["ApiError"];
2320
+ };
2321
+ };
2322
+ /** @description Notice not found (or belongs to a different organization). Also returned for every request while the `dpdp_offline_consent_link_api_enabled` flag is off. */
2323
+ 404: {
2324
+ headers: {
2325
+ [name: string]: unknown;
2326
+ };
2327
+ content: {
2328
+ "application/json": components["schemas"]["ApiError"];
2329
+ };
2330
+ };
2331
+ /** @description Per-API-key rate limit exceeded. */
2332
+ 429: {
2333
+ headers: {
2334
+ [name: string]: unknown;
2335
+ };
2336
+ content: {
2337
+ "application/json": components["schemas"]["ApiError"];
2338
+ };
2339
+ };
2340
+ };
2341
+ };
2342
+ syncOfflineCaptures: {
2343
+ parameters: {
2344
+ query?: never;
2345
+ header?: never;
2346
+ path?: never;
2347
+ cookie?: never;
2348
+ };
2349
+ requestBody: {
2350
+ content: {
2351
+ "application/json": {
2352
+ sessions: components["schemas"]["OfflineCaptureSession"][];
2353
+ };
2354
+ };
2355
+ };
2356
+ responses: {
2357
+ /** @description Per-session results. A 200 does **not** mean every session was accepted — inspect each result's `status`. */
2358
+ 200: {
2359
+ headers: {
2360
+ [name: string]: unknown;
2361
+ };
2362
+ content: {
2363
+ "application/json": {
2364
+ results: components["schemas"]["OfflineCaptureResult"][];
2365
+ };
2366
+ };
2367
+ };
2368
+ /** @description Malformed body, empty batch, or more than 200 sessions. */
2369
+ 400: {
2370
+ headers: {
2371
+ [name: string]: unknown;
2372
+ };
2373
+ content: {
2374
+ "application/json": components["schemas"]["ApiError"];
2375
+ };
2376
+ };
2377
+ /** @description Missing, invalid, or revoked API key. */
2378
+ 401: {
2379
+ headers: {
2380
+ [name: string]: unknown;
2381
+ };
2382
+ content: {
2383
+ "application/json": components["schemas"]["ApiError"];
2384
+ };
2385
+ };
2386
+ /** @description The `dpdp_offline_agent_capture_enabled` flag is off. */
2387
+ 404: {
2388
+ headers: {
2389
+ [name: string]: unknown;
2390
+ };
2391
+ content: {
2392
+ "application/json": components["schemas"]["ApiError"];
2393
+ };
2394
+ };
2395
+ /** @description Per-API-key rate limit exceeded. */
2396
+ 429: {
2397
+ headers: {
2398
+ [name: string]: unknown;
2399
+ };
2400
+ content: {
2401
+ "application/json": components["schemas"]["ApiError"];
2402
+ };
2403
+ };
2404
+ };
2405
+ };
2406
+ createPosConsentRequest: {
2407
+ parameters: {
2408
+ query?: never;
2409
+ header?: never;
2410
+ path?: never;
2411
+ cookie?: never;
2412
+ };
2413
+ requestBody: {
2414
+ content: {
2415
+ "application/json": {
2416
+ noticeId: string;
2417
+ purpose: string;
2418
+ dataTypes: string[];
2419
+ /** @description Raw number as keyed in; normalised and hashed server-side. Never stored in the clear. */
2420
+ phone: string;
2421
+ };
2422
+ };
2423
+ };
2424
+ responses: {
2425
+ /** @description Pending request created. */
2426
+ 201: {
2427
+ headers: {
2428
+ [name: string]: unknown;
2429
+ };
2430
+ content: {
2431
+ "application/json": {
2432
+ requestId: string;
2433
+ token: string;
2434
+ /** @description Epoch ms after which the request expires unanswered. */
2435
+ expiresAt: number;
2436
+ };
2437
+ };
2438
+ };
2439
+ /** @description Malformed body, unpublished notice, empty `dataTypes`, or a phone number containing no digits. */
2440
+ 400: {
2441
+ headers: {
2442
+ [name: string]: unknown;
2443
+ };
2444
+ content: {
2445
+ "application/json": components["schemas"]["ApiError"];
2446
+ };
2447
+ };
2448
+ /** @description Missing, invalid, or revoked API key. */
2449
+ 401: {
2450
+ headers: {
2451
+ [name: string]: unknown;
2452
+ };
2453
+ content: {
2454
+ "application/json": components["schemas"]["ApiError"];
2455
+ };
2456
+ };
2457
+ /** @description Notice not found, or the `dpdp_offline_async_consent_enabled` flag is off. */
2458
+ 404: {
2459
+ headers: {
2460
+ [name: string]: unknown;
2461
+ };
2462
+ content: {
2463
+ "application/json": components["schemas"]["ApiError"];
2464
+ };
2465
+ };
2466
+ /** @description Per-API-key rate limit exceeded. */
2467
+ 429: {
2468
+ headers: {
2469
+ [name: string]: unknown;
2470
+ };
2471
+ content: {
2472
+ "application/json": components["schemas"]["ApiError"];
2473
+ };
2474
+ };
2475
+ };
2476
+ };
2477
+ recordIvrConsentArtifact: {
2478
+ parameters: {
2479
+ query?: never;
2480
+ header?: never;
2481
+ path?: never;
2482
+ cookie?: never;
2483
+ };
2484
+ requestBody: {
2485
+ content: {
2486
+ "application/json": components["schemas"]["IvrConsentArtifact"];
2487
+ };
2488
+ };
2489
+ responses: {
2490
+ /** @description Artefact stored. */
2491
+ 201: {
2492
+ headers: {
2493
+ [name: string]: unknown;
2494
+ };
2495
+ content: {
2496
+ "application/json": {
2497
+ artifactId: string;
2498
+ consentId?: string | null;
2499
+ accepted: boolean;
2500
+ };
2501
+ };
2502
+ };
2503
+ /** @description Malformed body, missing recording URI, unpublished notice, or a locale the notice has no content for. */
2504
+ 400: {
2505
+ headers: {
2506
+ [name: string]: unknown;
2507
+ };
2508
+ content: {
2509
+ "application/json": components["schemas"]["ApiError"];
2510
+ };
2511
+ };
2512
+ /** @description Missing, invalid, or revoked API key. */
2513
+ 401: {
2514
+ headers: {
2515
+ [name: string]: unknown;
2516
+ };
2517
+ content: {
2518
+ "application/json": components["schemas"]["ApiError"];
2519
+ };
2520
+ };
2521
+ /** @description Notice not found, or the `dpdp_offline_async_consent_enabled` flag is off. */
2522
+ 404: {
2523
+ headers: {
2524
+ [name: string]: unknown;
2525
+ };
2526
+ content: {
2527
+ "application/json": components["schemas"]["ApiError"];
2528
+ };
2529
+ };
2530
+ /** @description Per-API-key rate limit exceeded. */
2531
+ 429: {
2532
+ headers: {
2533
+ [name: string]: unknown;
2534
+ };
2535
+ content: {
2536
+ "application/json": components["schemas"]["ApiError"];
2537
+ };
2538
+ };
2539
+ };
2540
+ };
2541
+ staffListDsrRequests: {
2542
+ parameters: {
2543
+ query: {
2544
+ organizationId: string;
2545
+ };
2546
+ header?: never;
2547
+ path?: never;
2548
+ cookie?: never;
2549
+ };
2550
+ requestBody?: never;
2551
+ responses: {
2552
+ /** @description The organization's DSR requests. */
2553
+ 200: {
2554
+ headers: {
2555
+ [name: string]: unknown;
2556
+ };
2557
+ content: {
2558
+ "application/json": {
2559
+ requests: Record<string, never>[];
2560
+ };
2561
+ };
2562
+ };
2563
+ /** @description Missing organizationId, or the caller isn't staff at that org. */
2564
+ 400: {
2565
+ headers: {
2566
+ [name: string]: unknown;
2567
+ };
2568
+ content: {
2569
+ "application/json": components["schemas"]["ApiError"];
2570
+ };
2571
+ };
2572
+ /** @description Not authenticated. */
2573
+ 401: {
2574
+ headers: {
2575
+ [name: string]: unknown;
2576
+ };
2577
+ content: {
2578
+ "application/json": components["schemas"]["ApiError"];
2579
+ };
2580
+ };
2581
+ /** @description The `dpdp_mobile_api_enabled` flag is off. */
2582
+ 404: {
2583
+ headers: {
2584
+ [name: string]: unknown;
2585
+ };
2586
+ content: {
2587
+ "application/json": components["schemas"]["ApiError"];
2588
+ };
2589
+ };
2590
+ };
2591
+ };
2592
+ staffListStatutoryBasisSuggestions: {
2593
+ parameters: {
2594
+ query?: {
2595
+ sector?: string;
2596
+ };
2597
+ header?: never;
2598
+ path?: never;
2599
+ cookie?: never;
2600
+ };
2601
+ requestBody?: never;
2602
+ responses: {
2603
+ /** @description Suggestions (empty if the feature flag is off). */
2604
+ 200: {
2605
+ headers: {
2606
+ [name: string]: unknown;
2607
+ };
2608
+ content: {
2609
+ "application/json": {
2610
+ suggestions: Record<string, never>[];
2611
+ };
2612
+ };
2613
+ };
2614
+ /** @description Not authenticated. */
2615
+ 401: {
2616
+ headers: {
2617
+ [name: string]: unknown;
2618
+ };
2619
+ content: {
2620
+ "application/json": components["schemas"]["ApiError"];
2621
+ };
2622
+ };
2623
+ /** @description The `dpdp_mobile_api_enabled` flag is off. */
2624
+ 404: {
2625
+ headers: {
2626
+ [name: string]: unknown;
2627
+ };
2628
+ content: {
2629
+ "application/json": components["schemas"]["ApiError"];
2630
+ };
2631
+ };
2632
+ };
2633
+ };
2634
+ staffUpdateDsrStatus: {
2635
+ parameters: {
2636
+ query?: never;
2637
+ header?: never;
2638
+ path: {
2639
+ requestId: string;
2640
+ };
2641
+ cookie?: never;
2642
+ };
2643
+ requestBody: {
2644
+ content: {
2645
+ "application/json": {
2646
+ /** @enum {string} */
2647
+ status: "pending" | "in_progress" | "completed" | "rejected";
2648
+ responsePayload?: unknown;
2649
+ };
2650
+ };
2651
+ };
2652
+ responses: {
2653
+ /** @description Updated. */
2654
+ 200: {
2655
+ headers: {
2656
+ [name: string]: unknown;
2657
+ };
2658
+ content: {
2659
+ "application/json": {
2660
+ updated: boolean;
2661
+ };
2662
+ };
2663
+ };
2664
+ /** @description Invalid status transition, or the caller isn't staff at that org. */
2665
+ 400: {
2666
+ headers: {
2667
+ [name: string]: unknown;
2668
+ };
2669
+ content: {
2670
+ "application/json": components["schemas"]["ApiError"];
2671
+ };
2672
+ };
2673
+ /** @description Not authenticated. */
2674
+ 401: {
2675
+ headers: {
2676
+ [name: string]: unknown;
2677
+ };
2678
+ content: {
2679
+ "application/json": components["schemas"]["ApiError"];
2680
+ };
2681
+ };
2682
+ };
2683
+ };
2684
+ staffGenerateDsrSummary: {
2685
+ parameters: {
2686
+ query?: never;
2687
+ header?: never;
2688
+ path: {
2689
+ requestId: string;
2690
+ };
2691
+ cookie?: never;
2692
+ };
2693
+ requestBody?: never;
2694
+ responses: {
2695
+ /** @description Generated and marked completed. */
2696
+ 200: {
2697
+ headers: {
2698
+ [name: string]: unknown;
2699
+ };
2700
+ content: {
2701
+ "application/json": {
2702
+ updated: boolean;
2703
+ };
2704
+ };
2705
+ };
2706
+ /** @description Wrong request type, terminal state, or the caller isn't staff at that org. */
2707
+ 400: {
2708
+ headers: {
2709
+ [name: string]: unknown;
2710
+ };
2711
+ content: {
2712
+ "application/json": components["schemas"]["ApiError"];
2713
+ };
2714
+ };
2715
+ /** @description Not authenticated. */
2716
+ 401: {
2717
+ headers: {
2718
+ [name: string]: unknown;
2719
+ };
2720
+ content: {
2721
+ "application/json": components["schemas"]["ApiError"];
2722
+ };
2723
+ };
2724
+ };
2725
+ };
2726
+ staffRejectDsrWithStatutoryBasis: {
2727
+ parameters: {
2728
+ query?: never;
2729
+ header?: never;
2730
+ path: {
2731
+ requestId: string;
2732
+ };
2733
+ cookie?: never;
2734
+ };
2735
+ requestBody: {
2736
+ content: {
2737
+ "application/json": {
2738
+ statute: string;
2739
+ citation: string;
2740
+ retentionPolicyId?: string;
2741
+ };
2742
+ };
2743
+ };
2744
+ responses: {
2745
+ /** @description Denied and recorded. */
2746
+ 200: {
2747
+ headers: {
2748
+ [name: string]: unknown;
2749
+ };
2750
+ content: {
2751
+ "application/json": {
2752
+ updated: boolean;
2753
+ };
2754
+ };
2755
+ };
2756
+ /** @description Missing fields, flag off, wrong request type, invalid transition, or the caller isn't staff at that org. */
2757
+ 400: {
2758
+ headers: {
2759
+ [name: string]: unknown;
2760
+ };
2761
+ content: {
2762
+ "application/json": components["schemas"]["ApiError"];
2763
+ };
2764
+ };
2765
+ /** @description Not authenticated. */
2766
+ 401: {
2767
+ headers: {
2768
+ [name: string]: unknown;
2769
+ };
2770
+ content: {
2771
+ "application/json": components["schemas"]["ApiError"];
2772
+ };
2773
+ };
2774
+ };
2775
+ };
2776
+ staffListGrievances: {
2777
+ parameters: {
2778
+ query: {
2779
+ organizationId: string;
2780
+ };
2781
+ header?: never;
2782
+ path?: never;
2783
+ cookie?: never;
2784
+ };
2785
+ requestBody?: never;
2786
+ responses: {
2787
+ /** @description The organization's grievances. */
2788
+ 200: {
2789
+ headers: {
2790
+ [name: string]: unknown;
2791
+ };
2792
+ content: {
2793
+ "application/json": {
2794
+ grievances: Record<string, never>[];
2795
+ };
2796
+ };
2797
+ };
2798
+ /** @description Missing organizationId, or the caller isn't staff at that org. */
2799
+ 400: {
2800
+ headers: {
2801
+ [name: string]: unknown;
2802
+ };
2803
+ content: {
2804
+ "application/json": components["schemas"]["ApiError"];
2805
+ };
2806
+ };
2807
+ /** @description Not authenticated. */
2808
+ 401: {
2809
+ headers: {
2810
+ [name: string]: unknown;
2811
+ };
2812
+ content: {
2813
+ "application/json": components["schemas"]["ApiError"];
2814
+ };
2815
+ };
2816
+ /** @description The `dpdp_mobile_api_enabled` flag is off. */
2817
+ 404: {
2818
+ headers: {
2819
+ [name: string]: unknown;
2820
+ };
2821
+ content: {
2822
+ "application/json": components["schemas"]["ApiError"];
2823
+ };
2824
+ };
2825
+ };
2826
+ };
2827
+ staffRespondToGrievance: {
2828
+ parameters: {
2829
+ query?: never;
2830
+ header?: never;
2831
+ path: {
2832
+ grievanceId: string;
2833
+ };
2834
+ cookie?: never;
2835
+ };
2836
+ requestBody: {
2837
+ content: {
2838
+ "application/json": {
2839
+ /** @enum {string} */
2840
+ status: "in_progress" | "resolved";
2841
+ response: string;
2842
+ };
2843
+ };
2844
+ };
2845
+ responses: {
2846
+ /** @description Responded. */
2847
+ 200: {
2848
+ headers: {
2849
+ [name: string]: unknown;
2850
+ };
2851
+ content: {
2852
+ "application/json": {
2853
+ updated: boolean;
2854
+ };
2855
+ };
2856
+ };
2857
+ /** @description Missing/invalid fields, or the caller isn't staff at that org. */
2858
+ 400: {
2859
+ headers: {
2860
+ [name: string]: unknown;
2861
+ };
2862
+ content: {
2863
+ "application/json": components["schemas"]["ApiError"];
2864
+ };
2865
+ };
2866
+ /** @description Not authenticated. */
2867
+ 401: {
2868
+ headers: {
2869
+ [name: string]: unknown;
2870
+ };
2871
+ content: {
2872
+ "application/json": components["schemas"]["ApiError"];
2873
+ };
2874
+ };
2875
+ };
2876
+ };
2877
+ }