@cookiemunch/sdk 0.1.1 → 0.3.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.
package/dist/index.d.ts CHANGED
@@ -114,6 +114,38 @@ interface DsarRequest {
114
114
  /** A test request: off the SLA board, labelled, and deletable with `dsar.delete`. A closed request can be marked one with `dsar.markTest`. */
115
115
  test?: boolean;
116
116
  }
117
+ /**
118
+ * How a rights-page requester was verified — on every answer of the public intake
119
+ * (`POST /api/v1/public/dsar`, `/verify`, `/resend`) and so in the `dsar.created` webhook payload.
120
+ * `email_code` on a 202: a code was mailed through your own provider; on a 201: the code matched.
121
+ * `none` with a `reason`: filed without verification — confirm the requester yourself. `none`
122
+ * without one: an opt-out, which needs no verification.
123
+ */
124
+ type PublicVerification = {
125
+ method: 'session' | 'email_code' | 'account_link';
126
+ } | {
127
+ method: 'none';
128
+ reason?: 'no_verification_configured' | 'mail_failed' | 'recipient_rejected';
129
+ };
130
+ /** A public intake that filed a request (201): also the `dsar.created` payload for one. */
131
+ interface PublicDsarFiled {
132
+ id: string;
133
+ status: 'received' | 'verifying';
134
+ /** Epoch ms the statutory response is due. */
135
+ deadline: number;
136
+ /** Only when filed without verification; the same as `verification.method` `none` with a `reason`. */
137
+ unverified?: true;
138
+ verification: PublicVerification;
139
+ }
140
+ /** A public intake waiting for its email code (202). */
141
+ interface PublicDsarPending {
142
+ pendingId: string;
143
+ expiresAt: number;
144
+ resendAfter?: number;
145
+ verification: {
146
+ method: 'email_code';
147
+ };
148
+ }
117
149
  interface DsarCreate {
118
150
  type: DsarType;
119
151
  subjectEmail: string;
@@ -220,13 +252,13 @@ declare function verifyWebhookSignature(input: VerifyWebhookInput): boolean;
220
252
  * from the key, so callers never pass an orgId. `fetch` is injectable for testing
221
253
  * and non-browser/non-Node runtimes; it defaults to the global fetch.
222
254
  *
223
- * const fc = createCookieMunch({ apiKey: 'fck_…', baseUrl: 'https://cmp.example.com' });
255
+ * const fc = createCookieMunch({ apiKey: 'fck_…', baseUrl: 'https://api.cookiemunch.net' });
224
256
  * const sites = await fc.sites.list();
225
257
  */
226
258
 
227
259
  interface CookieMunchOptions {
228
260
  apiKey: string;
229
- /** e.g. "https://cmp.example.com" — the /v1 prefix is appended automatically. */
261
+ /** "https://api.cookiemunch.net" — the /v1 prefix is appended automatically. */
230
262
  baseUrl: string;
231
263
  /** Injectable for tests / custom runtimes. Defaults to the global fetch. */
232
264
  fetch?: typeof fetch;
@@ -240,7 +272,9 @@ interface CookieMunchOptions {
240
272
  declare class CookieMunchApiError extends Error {
241
273
  readonly status: number;
242
274
  readonly code?: string;
243
- constructor(status: number, message: string, code?: string);
275
+ /** The parsed JSON error body, when there was one (e.g. `issues` on a 422). */
276
+ readonly body?: unknown;
277
+ constructor(status: number, message: string, code?: string, body?: unknown);
244
278
  }
245
279
  /** A cookie discovered on a site, classified into a consent category (wire shape of the
246
280
  * cookie-declaration feed). Matches the server's CategorizedCookie schema. */
@@ -250,6 +284,11 @@ interface CategorizedCookie {
250
284
  domain?: string;
251
285
  provider?: string;
252
286
  purpose?: string;
287
+ /**
288
+ * The purpose by language (lowercase BCP-47 tag). On a declared row, the owner's; on a
289
+ * row the cookie database classified, the database's (empty: none yet).
290
+ */
291
+ purposes?: Record<string, string>;
253
292
  expiry?: string;
254
293
  /** Page URLs (multi-page scan) that set this cookie, earliest first. */
255
294
  foundOnPages?: string[];
@@ -257,8 +296,34 @@ interface CategorizedCookie {
257
296
  declared?: boolean;
258
297
  /** A declared `prefix*` wildcard row that no observed cookie matched yet. */
259
298
  pattern?: boolean;
260
- /** Why a person should look at it. Visitors see such cookies under "Unclassified". */
261
- review?: 'unclassified' | 'category_disabled' | 'category_unknown';
299
+ /**
300
+ * Why a person should look at it. Visitors see unclassified and category ones under
301
+ * "Unclassified"; `retired_but_seen` = retired, but a crawl or a visit saw it since, so the
302
+ * site still sets it and it is listed again.
303
+ */
304
+ review?: 'unclassified' | 'category_disabled' | 'category_unknown' | 'retired_but_seen';
305
+ /** Epoch-ms a crawl or a real visit last saw it. Absent on older rows. */
306
+ lastSeenAt?: number;
307
+ /** Owner views only: the site owner retired this cookie (see `sites.retireCookie`). */
308
+ retired?: {
309
+ at: number;
310
+ renamedTo?: string;
311
+ note?: string;
312
+ by?: string;
313
+ pattern?: string;
314
+ };
315
+ }
316
+ /** A cookie the site owner retired: the site renamed or stopped setting it. */
317
+ interface RetiredCookie {
318
+ /** Exact name, or a `prefix*` wildcard. */
319
+ name: string;
320
+ /** Epoch-ms it was retired; anything seen after this brings it back. */
321
+ at: number;
322
+ renamedTo?: string;
323
+ note?: string;
324
+ /** `apikey:<prefix>` or a dashboard user id. */
325
+ by?: string;
326
+ pattern?: boolean;
262
327
  }
263
328
  /** A site's cookie declaration: the latest scan and observed visits with the site's own
264
329
  * declarations on top. This is what GET /v1/sites/:cbid/cookies returns. */
@@ -268,13 +333,21 @@ interface CookieDeclaration {
268
333
  cookies: CategorizedCookie[];
269
334
  /** The site owner's declarations, as stored. */
270
335
  declared?: DeclaredCookie[];
336
+ /** The site's retirements, as stored (owner views only). */
337
+ retired?: RetiredCookie[];
271
338
  }
272
339
  /** What the site owner says a cookie is (PUT /v1/sites/:cbid/cookies/:name). */
273
340
  interface DeclaredCookieInput {
274
341
  /** A standard category or one of the site's `categories.custom` ids. Not `unclassified`. */
275
342
  category: string;
276
- /** Shown to visitors. */
343
+ /** Shown to visitors, and the fallback for any language `purposes` lacks. */
277
344
  purpose: string;
345
+ /**
346
+ * The purpose in other languages: `{ es: '…', 'pt-BR': '…' }` (BCP-47 language or
347
+ * language-region tags, stored lowercased; ≤50 languages, ≤1000 characters each).
348
+ * The banner, `data-cc="declaration"` and /cookie-declaration.js draw the visitor's.
349
+ */
350
+ purposes?: Record<string, string> | null;
278
351
  provider?: string;
279
352
  expiry?: string;
280
353
  domain?: string;
@@ -286,6 +359,23 @@ interface DeclaredCookie extends DeclaredCookieInput {
286
359
  name: string;
287
360
  updatedAt: number;
288
361
  }
362
+ /** What a declaration write would change (`dryRun`). */
363
+ interface DeclarationDiff {
364
+ added: DeclaredCookie[];
365
+ removed: DeclaredCookie[];
366
+ changed: Array<{
367
+ name: string;
368
+ before: DeclaredCookie;
369
+ after: DeclaredCookie;
370
+ }>;
371
+ }
372
+ /** The answer to a `dryRun` declaration write: nothing was stored. */
373
+ interface DeclarationDryRun {
374
+ dryRun: true;
375
+ /** Every declaration the site would have. */
376
+ declared: DeclaredCookie[];
377
+ diff: DeclarationDiff;
378
+ }
289
379
  /** A warning about a write: e.g. the category is switched off for the site. */
290
380
  interface DeclarationWarning {
291
381
  field: string;
@@ -312,9 +402,43 @@ interface SiteCookie {
312
402
  }
313
403
  /** Cookie-scan status, from GET /v1/sites/:cbid/scan. */
314
404
  interface ScanStatus {
405
+ /** `scanning` while the last scan is queued or crawling. Kept for older clients; read `state`. */
315
406
  status: 'idle' | 'scanning';
316
407
  /** Epoch-ms of the last completed scan, or null. */
317
408
  lastScannedAt: number | null;
409
+ /** What the last scan saw of the live banner's Accept all / Reject all. Absent until measured. */
410
+ buttonParity?: ButtonParityScan;
411
+ /** Where the last scan is. Absent when the site was never scanned. */
412
+ state?: 'queued' | 'scanning' | 'done' | 'failed';
413
+ scanId?: string;
414
+ startedAt?: number;
415
+ finishedAt?: number;
416
+ durationMs?: number;
417
+ /** Cookies this crawl saw (the stored list also keeps earlier finds: `keptFromEarlier`). */
418
+ cookieCount?: number;
419
+ keptFromEarlier?: number;
420
+ pagesVisited?: number;
421
+ /** Why it failed. */
422
+ error?: string;
423
+ }
424
+ /** Consent-button parity of the banner a real browser saw on the site (see ScanStatus). */
425
+ interface ButtonParityScan {
426
+ url: string;
427
+ /** False when no visible consent accept control was found in a recognisable banner. */
428
+ bannerFound: boolean;
429
+ /**
430
+ * True when the checks ran: our embed, or a recognised banner with both Accept and Reject.
431
+ * False = not measured — no findings, `score` null. Absent on scans stored before it existed.
432
+ */
433
+ measured?: boolean;
434
+ /** `cookiemunch` = our embed; `other` = found by its button text. */
435
+ cmp: 'cookiemunch' | 'other' | null;
436
+ acceptFound: boolean;
437
+ rejectFound: boolean;
438
+ designWarnings: ButtonParityFinding[];
439
+ /** 0–100; null when no banner was found. */
440
+ score: number | null;
441
+ checkedAt?: number;
318
442
  }
319
443
  /** @deprecated The server returns {@link ScanStatus}; kept only for back-compat. */
320
444
  interface ScanResult {
@@ -388,6 +512,195 @@ interface ConfigDryRun {
388
512
  /** Every leaf that would change. */
389
513
  diff: ConfigChange[];
390
514
  warnings?: ConfigWarning[];
515
+ /** Consent-button parity of the would-be config (see {@link ButtonParityFinding}). */
516
+ designWarnings: ButtonParityFinding[];
517
+ }
518
+ /** The effective style of an Accept all / Reject all control. */
519
+ interface ParityControlSummary {
520
+ id?: string;
521
+ label: string;
522
+ element: 'button' | 'link';
523
+ background?: string;
524
+ color?: string;
525
+ borderColor?: string;
526
+ borderWidth?: number;
527
+ fontSize?: number;
528
+ fontWeight?: number;
529
+ width?: number;
530
+ height?: number;
531
+ }
532
+ /**
533
+ * One way Accept all is pushed harder than Reject all (colour, size, placement, copy, custom
534
+ * CSS). Returned as `designWarnings` on every config read and write, and by `lintConfig`.
535
+ * A warning, never an error — the config is saved regardless. See /docs/fair-consent-buttons.
536
+ */
537
+ interface ButtonParityFinding {
538
+ code: 'reject_missing_first_layer' | 'reject_missing_same_layer' | 'reject_hidden' | 'reject_below_fold' | 'reject_isolated' | 'reject_low_emphasis' | 'saturation_gap' | 'color_mismatch' | 'reject_text_low_contrast' | 'reject_styled_as_link' | 'font_size_gap' | 'font_weight_gap' | 'size_gap' | 'padding_gap' | 'border_mismatch' | 'reject_label_missing' | 'reject_label_long' | 'confirmshaming' | 'custom_css_asymmetric';
539
+ severity: 'warning' | 'notice';
540
+ layer: 'banner' | 'preferences' | 'modal' | 'popup' | 'bar' | 'inline' | 'custom';
541
+ accept: ParityControlSummary | null;
542
+ reject: ParityControlSummary | null;
543
+ metric: {
544
+ name: string;
545
+ accept?: number;
546
+ reject?: number;
547
+ value: number;
548
+ threshold: number;
549
+ };
550
+ detail: string;
551
+ fix: string;
552
+ where: {
553
+ view?: string;
554
+ variant?: string;
555
+ theme?: 'light' | 'dark';
556
+ breakpoint?: 'desktop' | 'mobile';
557
+ language?: string;
558
+ url?: string;
559
+ };
560
+ }
561
+ /** Reject all style values that would match the Accept all on the same layer. */
562
+ interface SuggestedRejectStyle {
563
+ layer: string;
564
+ view?: string;
565
+ background?: string;
566
+ color?: string;
567
+ borderColor?: string;
568
+ borderWidth?: number;
569
+ fontSize?: number;
570
+ fontWeight?: number;
571
+ width?: number;
572
+ height?: number;
573
+ }
574
+ /** `POST /v1/sites/:cbid/config/lint` — nothing is saved. */
575
+ interface ButtonParityLint {
576
+ /** `merged` = what PATCH would store (merged over the stored config); `replaced` = what PUT would store (`replace: true`). */
577
+ mode: 'merged' | 'replaced';
578
+ designWarnings: ButtonParityFinding[];
579
+ /** 100 minus 20 per warning and 5 per notice, floored at 0. */
580
+ score: number;
581
+ suggestedReject: SuggestedRejectStyle[];
582
+ }
583
+ /**
584
+ * Scrollbars on the surfaces Cookie Munch renders — the same shape on the banner theme (`theme.scrollbar`)
585
+ * and the rights-page theme. Colours are #hex, rgb() or hsl(); width is clamped to 4–16, radius to 0–999.
586
+ */
587
+ interface ScrollbarTheme {
588
+ style: 'themed' | 'thin' | 'native' | 'hidden';
589
+ thumb?: string;
590
+ thumbHover?: string;
591
+ track?: string;
592
+ width?: number;
593
+ radius?: number;
594
+ }
595
+ /** The hosted rights page document. See docs/rights-page for each section type's props. */
596
+ interface RightsPageDocument {
597
+ v: 1;
598
+ theme: {
599
+ preset: 'brand' | 'light' | 'dark' | 'custom';
600
+ width: 'narrow' | 'normal' | 'wide' | 'full';
601
+ density: 'compact' | 'comfortable' | 'spacious';
602
+ colorScheme: 'light' | 'dark' | 'auto';
603
+ scrollbar?: ScrollbarTheme;
604
+ [k: string]: unknown;
605
+ };
606
+ sections: Array<{
607
+ id: string;
608
+ type: string;
609
+ props: Record<string, unknown>;
610
+ hidden?: {
611
+ phone?: boolean;
612
+ desktop?: boolean;
613
+ };
614
+ style?: Record<string, unknown>;
615
+ }>;
616
+ form: {
617
+ requestTypes: Array<Record<string, unknown>>;
618
+ fields: Array<Record<string, unknown>>;
619
+ jurisdiction: 'auto' | 'ask' | 'hidden';
620
+ consentIdField: 'hidden' | 'optional' | 'required';
621
+ success: {
622
+ title?: string;
623
+ body?: string;
624
+ };
625
+ submitLabel?: string;
626
+ };
627
+ i18n: {
628
+ defaultLocale: string;
629
+ autoDetect: boolean;
630
+ overrides: Record<string, unknown>;
631
+ };
632
+ seo: {
633
+ title?: string;
634
+ description?: string;
635
+ favicon?: string;
636
+ image?: string;
637
+ index: boolean;
638
+ };
639
+ customCss?: string;
640
+ }
641
+ /** `message` is English; `code` (+ `params`) is stable, for your own wording or language. */
642
+ interface RightsPageIssue {
643
+ path: string;
644
+ message: string;
645
+ code?: string;
646
+ params?: Record<string, string | number>;
647
+ }
648
+ interface RightsPageDraft {
649
+ cbid: string;
650
+ draft: RightsPageDocument;
651
+ version: number;
652
+ publishedAt: number | null;
653
+ updatedAt: number | null;
654
+ warnings: RightsPageIssue[];
655
+ }
656
+ interface RightsPageDryRun {
657
+ dryRun: true;
658
+ cbid: string;
659
+ draft: RightsPageDocument;
660
+ warnings: RightsPageIssue[];
661
+ }
662
+ /** Who published a version: `publishedBy` is an actor id; `publishedByEmail` names a dashboard user (null for an API key). */
663
+ interface RightsPagePublisher {
664
+ publishedBy: string;
665
+ publishedByEmail: string | null;
666
+ publishedVia: 'dashboard' | 'api_key';
667
+ }
668
+ interface RightsPagePublished {
669
+ cbid: string;
670
+ page: RightsPageDocument;
671
+ version: number;
672
+ publishedAt: number;
673
+ publishedBy?: string | null;
674
+ publishedByEmail?: string | null;
675
+ publishedVia?: 'dashboard' | 'api_key' | null;
676
+ }
677
+ /**
678
+ * Optimistic concurrency for a draft write: the draft's `updatedAt` as you last read it (epoch ms or
679
+ * an ISO date; null = you saw no saved draft). A mismatch rejects with a 409 CookieMunchApiError whose
680
+ * body is RightsPageDraftConflict. Omitted: a full write (put) is last-write-wins; a patch merges onto the draft
681
+ * as it is when written, so a concurrent edit is not lost.
682
+ */
683
+ interface RightsPageWriteOptions {
684
+ baseUpdatedAt?: number | string | null;
685
+ }
686
+ interface RightsPageDraftConflict {
687
+ error: 'draft_conflict';
688
+ draft: RightsPageDraft;
689
+ }
690
+ /** `draftUpdatedAt`: the draft's updatedAt after the call — pass it as the next `baseUpdatedAt`. */
691
+ interface RightsPagePublishResult {
692
+ cbid: string;
693
+ version: number;
694
+ publishedAt: number;
695
+ draftUpdatedAt: number;
696
+ rolledBackTo?: number;
697
+ }
698
+ interface RightsPageVersions {
699
+ cbid: string;
700
+ versions: Array<{
701
+ version: number;
702
+ publishedAt: number;
703
+ } & RightsPagePublisher>;
391
704
  }
392
705
  /** Options for POST /v1/sites/:cbid/preview-token. All optional. */
393
706
  interface PreviewTokenOptions {
@@ -411,6 +724,70 @@ interface PreviewToken {
411
724
  /** The page with `cm_preview` / `cm_region` / `cm_lang` added. */
412
725
  previewUrl?: string;
413
726
  }
727
+ /** A right a rights link may file (the hosted rights page's request-type kinds). */
728
+ type RightKind = 'access' | 'erasure' | 'rectification' | 'portability' | 'restriction' | 'objection' | 'opt_out_sale' | 'opt_out_targeted' | 'limit_sensitive';
729
+ /** Input for POST /v1/sites/:cbid/rights-links. */
730
+ interface RightsLinkInput {
731
+ /** The signed-in person. `email` must be an address you have verified. */
732
+ subject: {
733
+ email: string;
734
+ userId?: string;
735
+ };
736
+ /** Limit the link to these rights. Default: every right the page offers. */
737
+ rights?: RightKind[];
738
+ /** Lifetime in seconds, 60..3600. Default 900. */
739
+ ttlSeconds?: number;
740
+ }
741
+ /** A signed, single-use link to the hosted rights page for one signed-in person. */
742
+ interface RightsLink {
743
+ url: string;
744
+ /** Epoch milliseconds. */
745
+ expiresAt: number;
746
+ }
747
+ /** One DNS record to create, exactly as written. */
748
+ interface DnsRecordInstruction {
749
+ type: 'CNAME' | 'TXT';
750
+ name: string;
751
+ value: string;
752
+ }
753
+ /** A custom hostname serving a site's rights page. */
754
+ interface RightsPageDomain {
755
+ /** Lowercase ASCII form (punycode for an internationalised name). */
756
+ hostname: string;
757
+ /** As a person reads it. */
758
+ unicodeHostname: string;
759
+ cbid: string;
760
+ /** pending_dns → verifying → issuing → active, or error (see lastError). */
761
+ status: 'pending_dns' | 'verifying' | 'issuing' | 'active' | 'error';
762
+ certStatus: 'none' | 'pending' | 'issued' | 'failed';
763
+ createdAt: number;
764
+ verifiedAt?: number;
765
+ activatedAt?: number;
766
+ lastCheckedAt?: number;
767
+ /** dns_not_found | wrong_target | hostname_in_use | router_write_failed | certificate_not_issued | dns_changed | probe_failed */
768
+ lastError?: string;
769
+ url: string;
770
+ /** The records to create: the CNAME, or (apex / flattened / proxied) the TXT plus an ALIAS to the same target. */
771
+ /** `cname.value` is this domain's own `<token>.cname.cookiemunch.net` — unique to the claim; a CNAME to anything else does not verify it. */
772
+ dns: {
773
+ recommended: 'cname' | 'flattened';
774
+ cname: DnsRecordInstruction;
775
+ txt: DnsRecordInstruction;
776
+ };
777
+ /** Only on a verify that found no proof: what DNS answered. */
778
+ dnsSeen?: {
779
+ cnames: string[];
780
+ addresses: string[];
781
+ txt: string[];
782
+ };
783
+ }
784
+ /** The site's custom hostnames, the plan allowance (null = unlimited) and the org's usage. */
785
+ interface RightsPageDomainList {
786
+ domains: RightsPageDomain[];
787
+ limit: number | null;
788
+ used: number;
789
+ target: string;
790
+ }
414
791
  /** Options for the snippet endpoint. */
415
792
  interface SnippetOptions {
416
793
  /** Override the site's configured `blocking.mode`. Default: the config's. */
@@ -469,7 +846,8 @@ type FlowOp = {
469
846
  */
470
847
  type FlowOpResponse = {
471
848
  ok: true;
472
- flow: Record<string, unknown>;
849
+ flow: Record<string, unknown>; /** Consent-button parity of the saved design. */
850
+ designWarnings?: ButtonParityFinding[];
473
851
  } | {
474
852
  ok: false;
475
853
  failedAt?: number;
@@ -625,6 +1003,150 @@ interface Org {
625
1003
  plan: string;
626
1004
  logoUrl: string | null;
627
1005
  }
1006
+ type MailProviderKind = 'brevo' | 'sendgrid' | 'postmark' | 'resend' | 'ses' | 'smtp';
1007
+ /**
1008
+ * The org's own mail provider for rights-request mail. The credential is never returned —
1009
+ * `secretLast4` only. `sender` says whether verification codes go through it right now
1010
+ * (`own`) or are not mailed at all (`none`): there is no shared sender for rights mail.
1011
+ */
1012
+ interface MailProvider {
1013
+ configured: boolean;
1014
+ sender: 'own' | 'none';
1015
+ provider?: MailProviderKind;
1016
+ fromEmail?: string;
1017
+ fromName?: string;
1018
+ replyTo?: string;
1019
+ ses?: {
1020
+ region: string;
1021
+ accessKeyId: string;
1022
+ };
1023
+ smtp?: {
1024
+ host: string;
1025
+ port: number;
1026
+ security: 'tls' | 'starttls';
1027
+ username: string;
1028
+ };
1029
+ secretLast4?: string;
1030
+ status?: 'untested' | 'verified' | 'failing';
1031
+ verifiedAt?: number | null;
1032
+ lastTest?: {
1033
+ ok: boolean;
1034
+ at: number;
1035
+ error?: string;
1036
+ } | null;
1037
+ updatedAt?: number;
1038
+ /** Only on `set`: no verification codes are mailed until a test succeeds. */
1039
+ note?: string;
1040
+ }
1041
+ /** Save a provider. `secret` is write-only; omit it to keep the stored one (same provider only). */
1042
+ interface MailProviderInput {
1043
+ provider: MailProviderKind;
1044
+ fromEmail: string;
1045
+ fromName?: string | null;
1046
+ replyTo?: string | null;
1047
+ secret?: string;
1048
+ ses?: {
1049
+ region: string;
1050
+ accessKeyId: string;
1051
+ };
1052
+ smtp?: {
1053
+ host: string;
1054
+ port: 25 | 465 | 587 | 2525;
1055
+ security: 'tls' | 'starttls';
1056
+ username: string;
1057
+ };
1058
+ }
1059
+ type RightsCaptchaProvider = 'turnstile' | 'hcaptcha' | 'recaptcha_v2' | 'recaptcha_v3';
1060
+ /**
1061
+ * The rights page's captcha in force: your own keys (`own`, recommended) or none (`off`, the default).
1062
+ * Cookie Munch's own captcha is never used on rights pages. The secret is never returned.
1063
+ */
1064
+ interface RightsCaptcha {
1065
+ /** `site`: the site's own setting; `org`: the organisation default; `default`: neither (off). */
1066
+ source: 'site' | 'org' | 'default';
1067
+ mode: 'own' | 'off';
1068
+ provider?: RightsCaptchaProvider;
1069
+ siteKey?: string;
1070
+ /** reCAPTCHA v3 only. */
1071
+ minScore?: number;
1072
+ secretSet: boolean;
1073
+ secretLast4?: string;
1074
+ status: 'verified' | 'disabled';
1075
+ verifiedAt: number | null;
1076
+ updatedAt: number | null;
1077
+ /** Only when a `set` turned the captcha off: what that costs. */
1078
+ warning?: string;
1079
+ }
1080
+ /**
1081
+ * `own` needs provider, siteKey and (the first time) secret; the provider is asked to accept the secret before
1082
+ * anything is saved (422 captcha_secret_invalid / 502 captcha_unreachable). `off` removes spam protection beyond
1083
+ * the hidden spam-trap field, the rate limits and the email code.
1084
+ */
1085
+ interface RightsCaptchaInput {
1086
+ mode: 'own' | 'off';
1087
+ provider?: RightsCaptchaProvider;
1088
+ siteKey?: string;
1089
+ /** Write-only. Omit to keep the stored one (same provider, same place). */
1090
+ secret?: string;
1091
+ /** reCAPTCHA v3 only: 0.1–0.9, default 0.5. */
1092
+ minScore?: number;
1093
+ }
1094
+ type RightsIdentityType = 'clerk' | 'atlas' | 'oidc_jwt';
1095
+ /**
1096
+ * The sign-in provider rights requests are verified with: a visitor signed in to your site is
1097
+ * verified by their session, with no code mail. Nothing here is secret.
1098
+ */
1099
+ interface RightsIdentity {
1100
+ /** `site`: the site's own setting; `org`: the organisation default; `default`: neither (none). */
1101
+ source: 'site' | 'org' | 'default';
1102
+ configured: boolean;
1103
+ type?: RightsIdentityType;
1104
+ issuer?: string;
1105
+ jwksUrl?: string;
1106
+ audience?: string;
1107
+ authorizedParties?: string[];
1108
+ emailClaim?: string;
1109
+ emailVerifiedClaim?: string;
1110
+ sessionCookieName?: string;
1111
+ /** Present (true) only when set: clerk/atlas tokens without the verified claim are accepted. */
1112
+ trustEmailClaim?: true;
1113
+ status: 'verified' | 'not_configured';
1114
+ verifiedAt: number | null;
1115
+ updatedAt: number | null;
1116
+ }
1117
+ /**
1118
+ * The JWKS is fetched and checked before anything is saved (502 identity_jwks_unreachable /
1119
+ * 422 identity_jwks_invalid). `authorizedParties` (your own origins) is required for clerk and atlas;
1120
+ * oidc_jwt needs an `audience` or `authorizedParties`. Issuer and JWKS URL are https on a host name,
1121
+ * never an IP address. The token must carry the email and a verified-email claim set to `true`
1122
+ * (clerk/atlas with `trustEmailClaim`: the verified claim may be absent).
1123
+ */
1124
+ interface RightsIdentityInput {
1125
+ type: RightsIdentityType;
1126
+ /** Exactly the token's `iss` (Clerk: your Frontend API URL). */
1127
+ issuer: string;
1128
+ /** Required for oidc_jwt; clerk/atlas default to `<issuer>/.well-known/jwks.json`. */
1129
+ jwksUrl?: string;
1130
+ audience?: string;
1131
+ authorizedParties?: string[];
1132
+ /** Default `email`. */
1133
+ emailClaim?: string;
1134
+ /** Default `email_verified`. */
1135
+ emailVerifiedClaim?: string;
1136
+ /** Default `__session`: the cookie the hosted page on your custom domain reads. */
1137
+ sessionCookieName?: string;
1138
+ /**
1139
+ * clerk/atlas only, default false. True when your provider has no verified-email claim and every
1140
+ * address it puts in the email claim is verified: a token without the verified claim is accepted.
1141
+ */
1142
+ trustEmailClaim?: boolean;
1143
+ }
1144
+ interface MailProviderTestResult {
1145
+ ok: boolean;
1146
+ sentTo: string;
1147
+ error?: string;
1148
+ mailProvider: MailProvider;
1149
+ }
628
1150
  /** Change an org's name or logo. `logoUrl: null` removes the logo. */
629
1151
  interface OrgUpdate {
630
1152
  name?: string;
@@ -708,6 +1230,8 @@ interface BannerSummary {
708
1230
  name: string;
709
1231
  updatedAt: number;
710
1232
  assignedCbids: string[];
1233
+ /** How many warning-severity consent-button parity findings the design has (0 = fair). */
1234
+ designWarningCount: number;
711
1235
  }
712
1236
  /** A full account-level banner record, including its config JSON. */
713
1237
  interface BannerRecord {
@@ -717,6 +1241,8 @@ interface BannerRecord {
717
1241
  json: SiteConfig;
718
1242
  createdAt: number;
719
1243
  updatedAt: number;
1244
+ /** Consent-button parity findings in the design. Never blocks a save. */
1245
+ designWarnings?: ButtonParityFinding[];
720
1246
  }
721
1247
  /**
722
1248
  * Input for the public consent-log ingest endpoint (POST /api/v1/consent) — the
@@ -1002,6 +1528,48 @@ interface DsarExecutor {
1002
1528
  /** Open a sub-task automatically when a request reaches fulfilment. */
1003
1529
  auto: boolean;
1004
1530
  createdAt: number;
1531
+ /** Where that system should send its completion webhooks. On every connection, secret or not. */
1532
+ webhookUrl: string;
1533
+ }
1534
+ /** What a connection write would do (`?dryRun=1`). Nothing was stored. */
1535
+ interface DsarExecutorDryRun {
1536
+ dryRun: true;
1537
+ /** The connection as it would be, credentials excluded. A create has no `id` or `webhookUrl` yet. */
1538
+ executor: Partial<DsarExecutor> & Record<string, unknown>;
1539
+ /** Each field that would change. */
1540
+ diff: ConfigChange[];
1541
+ warnings?: Array<{
1542
+ field: string;
1543
+ reason: string;
1544
+ }>;
1545
+ }
1546
+ /** Where a webhook check stopped. */
1547
+ type WebhookStage = 'configuration' | 'headers' | 'timestamp' | 'prefix' | 'signature';
1548
+ /** Which key a verified delivery matched: a `whsec_` secret's base64-decoded remainder, or the secret as typed. */
1549
+ type WebhookKeyForm = 'decoded' | 'raw';
1550
+ /** Whether a supplied delivery verified (`stage` and `reason` are null when it did). */
1551
+ interface ExecutorWebhookTestResult {
1552
+ verified: boolean;
1553
+ stage: WebhookStage | null;
1554
+ reason: string | null;
1555
+ /** Which key form matched; null when refused. */
1556
+ keyForm: WebhookKeyForm | null;
1557
+ }
1558
+ /** One delivery to a connection's webhook. Never the secret, the signature or the body. */
1559
+ interface ExecutorWebhookDelivery {
1560
+ id: string;
1561
+ executorId: string;
1562
+ at: number;
1563
+ verified: boolean;
1564
+ stage: WebhookStage | null;
1565
+ reason: string | null;
1566
+ /** The HTTP status we answered with. */
1567
+ status: number;
1568
+ /** The first 16 hex characters of SHA-256 over the raw body. */
1569
+ bodySha256: string;
1570
+ bodyBytes: number;
1571
+ /** Which key form matched; null when refused (or logged before this was kept). Never the key. */
1572
+ keyForm: WebhookKeyForm | null;
1005
1573
  }
1006
1574
  interface DsarExecutorInput {
1007
1575
  /** The name this connection answers to in a plan, e.g. `identity` or `crm`. */
@@ -1010,15 +1578,25 @@ interface DsarExecutorInput {
1010
1578
  baseUrl: string;
1011
1579
  /** Its API key. Stored encrypted; never returned. */
1012
1580
  secretKey: string;
1013
- /** The signing secret of its webhook endpoint. Optional — polling closes tasks without it. */
1581
+ /**
1582
+ * The signing secret of its webhook endpoint. Optional — polling closes tasks without it.
1583
+ * A `whsec_<base64>` secret (standard base64 or base64url, padded or not) verifies a delivery
1584
+ * signed with either the base64-decoded bytes or the literal string; anything else only with
1585
+ * its UTF-8 bytes.
1586
+ */
1014
1587
  webhookSecret?: string;
1015
1588
  auto?: boolean;
1016
1589
  /** How to drive it. */
1017
1590
  profile: ExecutorProfile;
1018
1591
  }
1019
- interface DsarExecutorCreated extends DsarExecutor {
1020
- /** Point the connected system's webhook endpoint here. */
1021
- webhookUrl: string;
1592
+ type DsarExecutorCreated = DsarExecutor;
1593
+ /** The fields `updateExecutor` may change. */
1594
+ interface DsarExecutorPatch {
1595
+ profile?: unknown;
1596
+ baseUrl?: string;
1597
+ secretKey?: string;
1598
+ webhookSecret?: string | null;
1599
+ auto?: boolean;
1022
1600
  }
1023
1601
  /** One entry in a fulfilment task's status history. */
1024
1602
  interface DsarTaskEvent {
@@ -1182,9 +1760,33 @@ interface CookieMunchClient {
1182
1760
  dryRunConfig(cbid: string, config: Partial<SiteConfig>, opts?: {
1183
1761
  mode?: 'patch' | 'put';
1184
1762
  } & PutConfigOptions): Promise<ConfigDryRun>;
1763
+ /**
1764
+ * Check a proposed config for consent-button parity — an Accept all pushed harder than
1765
+ * Reject all — without saving it. A partial v1 config is merged over the stored one (like
1766
+ * PATCH); a v2 design, or `replace: true`, is linted as sent. Needs only `sites:read`.
1767
+ */
1768
+ lintConfig(cbid: string, config: Partial<SiteConfig>, opts?: {
1769
+ replace?: boolean;
1770
+ }): Promise<ButtonParityLint>;
1185
1771
  cookies(cbid: string): Promise<CookieDeclaration>;
1186
- scan(cbid: string): Promise<ScanStatus>;
1187
- scanStatus(cbid: string): Promise<ScanStatus>;
1772
+ /**
1773
+ * Start a cookie crawl. Answers at once with `scanId` and `state: 'queued'`; `wait`
1774
+ * (seconds, ≤60) holds the request until the scan is done or failed.
1775
+ */
1776
+ scan(cbid: string, opts?: {
1777
+ wait?: number;
1778
+ }): Promise<ScanStatus>;
1779
+ /** The last scan's state. `wait` (seconds, ≤60) holds the request until a running scan settles. */
1780
+ scanStatus(cbid: string, opts?: {
1781
+ wait?: number;
1782
+ }): Promise<ScanStatus>;
1783
+ /**
1784
+ * Resolve once the site's scan is done or failed (read `state` and `error`), long-polling
1785
+ * the server. At `timeoutMs` (default 120 000) it resolves with the still-running state.
1786
+ */
1787
+ waitForScan(cbid: string, opts?: {
1788
+ timeoutMs?: number;
1789
+ }): Promise<ScanStatus>;
1188
1790
  ab(cbid: string): Promise<AbResult[]>;
1189
1791
  /** Generate the site's privacy and cookie policy, as Markdown. */
1190
1792
  policy(cbid: string, opts?: PolicyOptions): Promise<string>;
@@ -1221,24 +1823,63 @@ interface CookieMunchClient {
1221
1823
  /**
1222
1824
  * Declare what one cookie is. Overrides scanned, observed and database classification
1223
1825
  * in the API, the preference modal and `data-cc="declaration"`. A name ending in `*`
1224
- * declares a prefix wildcard.
1826
+ * declares a prefix wildcard. `dryRun` validates and returns the would-be list and a
1827
+ * diff without storing anything.
1225
1828
  */
1226
- declareCookie(cbid: string, name: string, input: DeclaredCookieInput): Promise<{
1829
+ declareCookie(cbid: string, name: string, input: DeclaredCookieInput, opts?: {
1830
+ dryRun?: boolean;
1831
+ }): Promise<{
1227
1832
  cookie: DeclaredCookie;
1228
1833
  warnings?: DeclarationWarning[];
1834
+ } & Partial<DeclarationDryRun>>;
1835
+ /**
1836
+ * Retire a cookie the site renamed or stopped setting: it leaves the banner's list,
1837
+ * `data-cc="declaration"` and the public feed, and stays listed for you with `retired`.
1838
+ * A name ending in `*` retires every cookie with that prefix. If a crawl or a visit sees
1839
+ * it again afterwards it is listed again, flagged `review: 'retired_but_seen'`.
1840
+ */
1841
+ retireCookie(cbid: string, name: string, input?: {
1842
+ renamedTo?: string;
1843
+ note?: string;
1844
+ }, opts?: {
1845
+ dryRun?: boolean;
1846
+ }): Promise<{
1847
+ cookie: RetiredCookie;
1848
+ matched: string[];
1849
+ dryRun?: true;
1850
+ retired?: RetiredCookie[];
1851
+ }>;
1852
+ /** Un-retire a cookie: it is listed again everywhere. */
1853
+ unretireCookie(cbid: string, name: string): Promise<void>;
1854
+ /** What un-retiring would leave; nothing is removed. */
1855
+ unretireCookie(cbid: string, name: string, opts: {
1856
+ dryRun: true;
1857
+ }): Promise<{
1858
+ dryRun: true;
1859
+ retired: RetiredCookie[];
1229
1860
  }>;
1230
1861
  /** Remove a declaration; the scanned classification applies again. */
1231
1862
  undeclareCookie(cbid: string, name: string): Promise<void>;
1232
- /** Declare many at once (all-or-nothing). `replace` also removes declarations not listed. */
1863
+ /** What removing a declaration would leave; nothing is removed. */
1864
+ undeclareCookie(cbid: string, name: string, opts: {
1865
+ dryRun: true;
1866
+ }): Promise<DeclarationDryRun>;
1867
+ /**
1868
+ * Declare many at once (all-or-nothing). `replace` also removes declarations not listed;
1869
+ * `dryRun` answers with what would be stored and a diff, storing nothing.
1870
+ */
1233
1871
  declareCookies(cbid: string, cookies: Array<DeclaredCookieInput & {
1234
1872
  name: string;
1235
1873
  }>, opts?: {
1236
1874
  replace?: boolean;
1875
+ dryRun?: boolean;
1237
1876
  }): Promise<{
1238
1877
  declared: DeclaredCookie[];
1239
1878
  saved: number;
1240
1879
  removed: number;
1241
1880
  warnings?: DeclarationWarning[];
1881
+ dryRun?: true;
1882
+ diff?: DeclarationDiff;
1242
1883
  }>;
1243
1884
  snippet(cbid: string, opts?: SnippetOptions): Promise<InstallSnippet>;
1244
1885
  /**
@@ -1352,6 +1993,38 @@ interface CookieMunchClient {
1352
1993
  }>;
1353
1994
  delete(id: string): Promise<void>;
1354
1995
  };
1996
+ /** The hosted rights page (cookiemunch.net/r/<cbid> or the site's own domain). */
1997
+ rightsPage: {
1998
+ get(cbid: string): Promise<RightsPageDraft>;
1999
+ /** Replace the draft. Nothing is live until publish(). `opts.baseUpdatedAt` refuses to overwrite a newer save (409 draft_conflict). */
2000
+ put(cbid: string, page: RightsPageDocument, opts?: RightsPageWriteOptions): Promise<RightsPageDraft>;
2001
+ /** Merge into the draft: objects merge, arrays replace, null removes. `opts.baseUpdatedAt` as on put(). */
2002
+ patch(cbid: string, patch: Record<string, unknown>, opts?: RightsPageWriteOptions): Promise<RightsPageDraft>;
2003
+ /** Validate a write without saving it. */
2004
+ dryRun(cbid: string, page: Record<string, unknown>, opts?: {
2005
+ mode?: 'patch' | 'put';
2006
+ }): Promise<RightsPageDryRun>;
2007
+ getPublished(cbid: string): Promise<RightsPagePublished>;
2008
+ /**
2009
+ * Publish the draft; it goes live at once. Pass `opts.baseUpdatedAt` (the draft's updatedAt
2010
+ * as you read it) so only the draft you saw goes live: 409 draft_conflict otherwise.
2011
+ */
2012
+ publish(cbid: string, opts?: RightsPageWriteOptions): Promise<RightsPagePublishResult>;
2013
+ versions(cbid: string): Promise<RightsPageVersions>;
2014
+ /**
2015
+ * Publish an earlier version again; it goes live at once and REPLACES the current draft
2016
+ * (unpublished edits are lost). `opts.baseUpdatedAt` refuses with 409 if the draft moved.
2017
+ */
2018
+ rollback(cbid: string, version: number, opts?: RightsPageWriteOptions): Promise<RightsPagePublishResult>;
2019
+ /** Custom hostnames serving the rights page, with the plan allowance. */
2020
+ listDomains(cbid: string): Promise<RightsPageDomainList>;
2021
+ /** Add a custom hostname (e.g. privacy.example.com); the answer carries the DNS records to create. */
2022
+ addDomain(cbid: string, hostname: string): Promise<RightsPageDomain>;
2023
+ /** Check it now: DNS while pending, the HTTPS answer once routed. Always the domain as it stands. */
2024
+ verifyDomain(cbid: string, hostname: string): Promise<RightsPageDomain>;
2025
+ /** Remove it: it stops being served and its certificate is not renewed. */
2026
+ removeDomain(cbid: string, hostname: string): Promise<void>;
2027
+ };
1355
2028
  /**
1356
2029
  * Identity resolution. Reads are POSTs on purpose: a person's identifiers travel in the
1357
2030
  * body, never a URL where they would land in access logs.
@@ -1546,13 +2219,21 @@ interface CookieMunchClient {
1546
2219
  * is kept unless you pass a new `secretKey` — so adding a field to a profile does not
1547
2220
  * cost you the connection or its id.
1548
2221
  */
1549
- updateExecutor(id: string, patch: {
1550
- profile?: unknown;
1551
- baseUrl?: string;
1552
- secretKey?: string;
1553
- webhookSecret?: string | null;
1554
- auto?: boolean;
1555
- }): Promise<DsarExecutor>;
2222
+ updateExecutor(id: string, patch: DsarExecutorPatch): Promise<DsarExecutor>;
2223
+ /** What `connectExecutor` would create, validated in full; nothing is stored (`?dryRun=1`). */
2224
+ dryRunConnectExecutor(input: DsarExecutorInput): Promise<DsarExecutorDryRun>;
2225
+ /** What `updateExecutor` would change, with a diff; the stored connection is untouched (`?dryRun=1`). */
2226
+ dryRunUpdateExecutor(id: string, patch: DsarExecutorPatch): Promise<DsarExecutorDryRun>;
2227
+ /**
2228
+ * Would this webhook delivery verify? Runs the receiver's exact check on headers and a raw
2229
+ * body you supply, acts on nothing, and names the stage that failed.
2230
+ */
2231
+ testExecutorWebhook(id: string, delivery: {
2232
+ headers: Record<string, string>;
2233
+ body: string;
2234
+ }): Promise<ExecutorWebhookTestResult>;
2235
+ /** The last 50 deliveries to a connection's webhook, newest first, each with its reason. */
2236
+ executorWebhookDeliveries(id: string): Promise<ExecutorWebhookDelivery[]>;
1556
2237
  /** Disconnect a system; its open sub-tasks stop being driven. */
1557
2238
  disconnectExecutor(id: string): Promise<void>;
1558
2239
  /** The export bundle a connected system produced, fetched from it on demand. */
@@ -1619,6 +2300,35 @@ interface CookieMunchClient {
1619
2300
  get(): Promise<Org>;
1620
2301
  /** Rename the org or set its logo. Deleting the org is not available through the API. */
1621
2302
  update(patch: OrgUpdate): Promise<Org>;
2303
+ /**
2304
+ * Your own mail provider for rights-request mail. It carries verification codes once
2305
+ * `test` succeeds; every `set` clears that. There is no shared sender: without one, requests
2306
+ * are verified by your sign-in provider (`rightsIdentity`) or filed unverified for you to confirm.
2307
+ */
2308
+ mailProvider: {
2309
+ get(): Promise<MailProvider>;
2310
+ set(input: MailProviderInput): Promise<MailProvider>;
2311
+ remove(): Promise<void>;
2312
+ /** Send a test through your provider. `to` defaults to the reply-to, else the from address. */
2313
+ test(to?: string): Promise<MailProviderTestResult>;
2314
+ };
2315
+ /**
2316
+ * The default captcha for your rights pages, for every site without its own (`rightsCaptcha`): your own
2317
+ * keys (recommended) or off. Without one, rights pages have no captcha.
2318
+ */
2319
+ rightsCaptcha: {
2320
+ get(): Promise<RightsCaptcha>;
2321
+ set(input: RightsCaptchaInput): Promise<RightsCaptcha>;
2322
+ /** Remove the default; answers the setting now in force (off). */
2323
+ remove(): Promise<RightsCaptcha>;
2324
+ };
2325
+ /** The default sign-in provider rights requests are verified with, for every site without its own. */
2326
+ rightsIdentity: {
2327
+ get(): Promise<RightsIdentity>;
2328
+ set(input: RightsIdentityInput): Promise<RightsIdentity>;
2329
+ /** Remove the default; answers the setting now in force. */
2330
+ remove(): Promise<RightsIdentity>;
2331
+ };
1622
2332
  };
1623
2333
  /** The org's audit log, newest first. API actions appear as `apikey:<prefix>`. */
1624
2334
  audit(limit?: number): Promise<{
@@ -1676,6 +2386,34 @@ interface CookieMunchClient {
1676
2386
  /** Deliver a dead letter again, to the subscription as it is now. */
1677
2387
  replayDeadLetter(id: string): Promise<unknown>;
1678
2388
  };
2389
+ /**
2390
+ * Account-linked rights requests: a single-use link to the hosted rights page for a person your
2391
+ * backend knows is signed in. The page locks their email and skips the code step. Requires dsar:write.
2392
+ */
2393
+ rightsLinks: {
2394
+ create(cbid: string, input: RightsLinkInput): Promise<RightsLink>;
2395
+ };
2396
+ /**
2397
+ * A site's rights-page captcha: your own Turnstile, hCaptcha or reCAPTCHA keys (recommended), or off. A site
2398
+ * without its own setting uses the organisation default (`org.rightsCaptcha`), else off. Requires sites:read / sites:write.
2399
+ */
2400
+ rightsCaptcha: {
2401
+ get(cbid: string): Promise<RightsCaptcha>;
2402
+ set(cbid: string, input: RightsCaptchaInput): Promise<RightsCaptcha>;
2403
+ /** Remove the site's own setting: it inherits the organisation default again. Answers the setting now in force. */
2404
+ remove(cbid: string): Promise<RightsCaptcha>;
2405
+ };
2406
+ /**
2407
+ * A site's sign-in provider (Clerk, Atlas or any JWKS issuer): a visitor signed in to your site
2408
+ * is verified by their session, with no code mail. A site without its own setting uses the
2409
+ * organisation default (`org.rightsIdentity`). Requires sites:read / sites:write.
2410
+ */
2411
+ rightsIdentity: {
2412
+ get(cbid: string): Promise<RightsIdentity>;
2413
+ set(cbid: string, input: RightsIdentityInput): Promise<RightsIdentity>;
2414
+ /** Remove the site's own setting: it inherits the organisation default again. */
2415
+ remove(cbid: string): Promise<RightsIdentity>;
2416
+ };
1679
2417
  /** One person's consent across every site in the org, by the subjectId your apps attach. */
1680
2418
  subjects: {
1681
2419
  /** Requires consent:read; not available to property-locked keys. */
@@ -1711,4 +2449,4 @@ interface CookieMunchClient {
1711
2449
  }
1712
2450
  declare function createCookieMunch(opts: CookieMunchOptions): CookieMunchClient;
1713
2451
 
1714
- export { type AbResult, type AccountOrg, type AccountOrgs, type AdPersonalizationInput, type AiInspectInput, type AiInspectResult, type ApiKey, type ApiKeyIssueInput, type ApiKeyIssued, type ApiKeyPrefix, type ApiKeyUpdate, type AppliedImport, type AssetUpload, type AuditEntry, type BannerRecord, type BannerSummary, type BlockedReport, type BrandExtractionResult, type BrandKit, type BrandKitCreate, type BrandSuggestion, type BulkSiteInput, type BulkSiteResult, type CategorizedCookie, type ChildKeyInput, type ConfigChange, type ConfigDryRun, type ConfigWarning, type ConsentDay, type ConsentDecisionInput, type ConsentIngestInput, type ConsentLogRow, type CookieDeclaration, CookieMunchApiError, type CookieMunchClient, type CookieMunchOptions, type CspSources, type DeclarationWarning, type DeclaredCookie, type DeclaredCookieInput, type DsarCreate, type DsarEraseResult, type DsarExecutor, type DsarExecutorCreated, type DsarExecutorInput, type DsarExportResult, type DsarRequest, type DsarStatus, type DsarTask, type DsarTaskEvent, type DsarTaskExport, type DsarTaskLogEntry, type DsarTaskOutcome, type DsarType, type EnforcementRuleInput, type ExecutorProfile, type ExecutorTestInput, type ExecutorTestResult, type FlowIssue, type FlowOp, type FlowOpResponse, type FulfillmentOp, type Identifier, type Identity, type ImportedCookie, type ImportedDeclaration, type InstallSnippet, type LegalBasis, type LogQuery, type Member, type OptInMethod, type Org, type OrgUpdate, type PlanSource, type PolicyOptions, type PreferenceItem, type PreferenceRecord, type PreviewToken, type PreviewTokenOptions, type ProfileAttributeInput, type PutConfigOptions, type RangeQuery, type Regulation, type RegulationSummary, type RegulatoryFeedResult, type ResellerChild, type ResellerChildCreate, type ResellerChildList, type ResellerChildPatch, type RiskScore, type RopaEntry, type RopaInput, type ScanResult, type ScanStatus, type ScoredVendor, type SessionAnalysisInput, type SignedReceipt, type Site, type SiteConfig, type SiteCookie, type SiteCreate, type SiteFlow, type SnippetOptions, type SubscriptionTopicInput, type SupportedLanguage, type Usage, type VendorInput, type VendorRecord, type VerifyResult, type VerifyWebhookInput, type WebhookCreate, type WebhookDeadLetter, type WebhookSubscription, type WebhookTestResult, type WebhookUpdate, createCookieMunch, verifyWebhookSignature };
2452
+ export { type AbResult, type AccountOrg, type AccountOrgs, type AdPersonalizationInput, type AiInspectInput, type AiInspectResult, type ApiKey, type ApiKeyIssueInput, type ApiKeyIssued, type ApiKeyPrefix, type ApiKeyUpdate, type AppliedImport, type AssetUpload, type AuditEntry, type BannerRecord, type BannerSummary, type BlockedReport, type BrandExtractionResult, type BrandKit, type BrandKitCreate, type BrandSuggestion, type BulkSiteInput, type BulkSiteResult, type ButtonParityFinding, type ButtonParityLint, type ButtonParityScan, type CategorizedCookie, type ChildKeyInput, type ConfigChange, type ConfigDryRun, type ConfigWarning, type ConsentDay, type ConsentDecisionInput, type ConsentIngestInput, type ConsentLogRow, type CookieDeclaration, CookieMunchApiError, type CookieMunchClient, type CookieMunchOptions, type CspSources, type DeclarationDiff, type DeclarationDryRun, type DeclarationWarning, type DeclaredCookie, type DeclaredCookieInput, type DnsRecordInstruction, type DsarCreate, type DsarEraseResult, type DsarExecutor, type DsarExecutorCreated, type DsarExecutorDryRun, type DsarExecutorInput, type DsarExecutorPatch, type DsarExportResult, type DsarRequest, type DsarStatus, type DsarTask, type DsarTaskEvent, type DsarTaskExport, type DsarTaskLogEntry, type DsarTaskOutcome, type DsarType, type EnforcementRuleInput, type ExecutorProfile, type ExecutorTestInput, type ExecutorTestResult, type ExecutorWebhookDelivery, type ExecutorWebhookTestResult, type FlowIssue, type FlowOp, type FlowOpResponse, type FulfillmentOp, type Identifier, type Identity, type ImportedCookie, type ImportedDeclaration, type InstallSnippet, type LegalBasis, type LogQuery, type MailProvider, type MailProviderInput, type MailProviderKind, type MailProviderTestResult, type Member, type OptInMethod, type Org, type OrgUpdate, type ParityControlSummary, type PlanSource, type PolicyOptions, type PreferenceItem, type PreferenceRecord, type PreviewToken, type PreviewTokenOptions, type ProfileAttributeInput, type PublicDsarFiled, type PublicDsarPending, type PublicVerification, type PutConfigOptions, type RangeQuery, type Regulation, type RegulationSummary, type RegulatoryFeedResult, type ResellerChild, type ResellerChildCreate, type ResellerChildList, type ResellerChildPatch, type RetiredCookie, type RightKind, type RightsCaptcha, type RightsCaptchaInput, type RightsCaptchaProvider, type RightsIdentity, type RightsIdentityInput, type RightsIdentityType, type RightsLink, type RightsLinkInput, type RightsPageDocument, type RightsPageDomain, type RightsPageDomainList, type RightsPageDraft, type RightsPageDraftConflict, type RightsPageDryRun, type RightsPageIssue, type RightsPagePublishResult, type RightsPagePublished, type RightsPagePublisher, type RightsPageVersions, type RightsPageWriteOptions, type RiskScore, type RopaEntry, type RopaInput, type ScanResult, type ScanStatus, type ScoredVendor, type ScrollbarTheme, type SessionAnalysisInput, type SignedReceipt, type Site, type SiteConfig, type SiteCookie, type SiteCreate, type SiteFlow, type SnippetOptions, type SubscriptionTopicInput, type SuggestedRejectStyle, type SupportedLanguage, type Usage, type VendorInput, type VendorRecord, type VerifyResult, type VerifyWebhookInput, type WebhookCreate, type WebhookDeadLetter, type WebhookKeyForm, type WebhookStage, type WebhookSubscription, type WebhookTestResult, type WebhookUpdate, createCookieMunch, verifyWebhookSignature };