@reclaimprotocol/client 0.1.0 → 0.1.2

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.
@@ -31,7 +31,10 @@ export interface paths {
31
31
  path?: never;
32
32
  cookie?: never;
33
33
  };
34
- /** Get the homepage */
34
+ /**
35
+ * Discover home — search a website to verify
36
+ * @description Default home page. A website-first search: the visitor types a website and picks one to continue to `/site/{domain}`, where they choose what data to prove. Renders popular websites below the search.
37
+ */
35
38
  get: operations["Index"];
36
39
  put?: never;
37
40
  post?: never;
@@ -102,6 +105,212 @@ export interface paths {
102
105
  patch?: never;
103
106
  trace?: never;
104
107
  };
108
+ "/discover/websites": {
109
+ parameters: {
110
+ query?: never;
111
+ header?: never;
112
+ path?: never;
113
+ cookie?: never;
114
+ };
115
+ /**
116
+ * Suggest websites for the Discover flow
117
+ * @description Website-first autocomplete that backs the Discover home page (`/`). Returns the distinct websites (one entry per domain) that have at least one verification the caller can see, ranked by relevance to `q`. Each entry carries the aggregated list of data points provable for that website. With no `q`, returns popular websites (most verifications first).
118
+ *
119
+ * HTML / HTMX callers receive a fragment list (swapped into the search dropdown); JSON / SDK callers receive the suggestions document.
120
+ */
121
+ get: operations["DiscoverWebsites"];
122
+ put?: never;
123
+ post?: never;
124
+ delete?: never;
125
+ options?: never;
126
+ head?: never;
127
+ patch?: never;
128
+ trace?: never;
129
+ };
130
+ "/site/{domain}": {
131
+ parameters: {
132
+ query?: never;
133
+ header?: never;
134
+ path?: never;
135
+ cookie?: never;
136
+ };
137
+ /**
138
+ * Website landing & data-point selection page
139
+ * @description SEO landing page for a website, and the data-point selection step of the Discover flow. Lists every data point Reclaim can currently prove for `{domain}` (aggregated across all verifications the caller can see) so a visitor can pick what to verify and continue. Organic search traffic ("verify github username") and the in-app `/` → website-select flow converge on this single canonical URL.
140
+ *
141
+ * HTML callers receive the full page; when `q` is present and the request is an HTMX request, only the filtered data-point list fragment is returned. JSON / SDK callers receive the website's data points as a document.
142
+ */
143
+ get: operations["SitePage"];
144
+ put?: never;
145
+ post?: never;
146
+ delete?: never;
147
+ options?: never;
148
+ head?: never;
149
+ patch?: never;
150
+ trace?: never;
151
+ };
152
+ "/site/{domain}/panel": {
153
+ parameters: {
154
+ query?: never;
155
+ header?: never;
156
+ path?: never;
157
+ cookie?: never;
158
+ };
159
+ /**
160
+ * Discover summary panel fragment (htmx)
161
+ * @description HTMX-only fragment for the Discover site page. The data-point form fires this on every selection change (checkbox / mode / source pin), carrying the whole selection in the query string. Returns the summary panel aside (the swap target) plus an out-of-band swap of the Advanced source picker.
162
+ */
163
+ get: operations["SitePanel"];
164
+ put?: never;
165
+ post?: never;
166
+ delete?: never;
167
+ options?: never;
168
+ head?: never;
169
+ patch?: never;
170
+ trace?: never;
171
+ };
172
+ "/site/{domain}/build": {
173
+ parameters: {
174
+ query?: never;
175
+ header?: never;
176
+ path?: never;
177
+ cookie?: never;
178
+ };
179
+ /**
180
+ * Build page — providers, try, and integration guide for a selection
181
+ * @description The step after data-point selection on `/site/{domain}`. Given the selected data points (plus optional pinned sources, provided values, and a resolution `mode`), shows which existing verification providers cover the selection, a member-only "Try verification" action, and a ready-to-paste integration guide. The whole selection travels in the query string so the page is server-rendered and back-navigable.
182
+ */
183
+ get: operations["SiteBuild"];
184
+ put?: never;
185
+ post?: never;
186
+ delete?: never;
187
+ options?: never;
188
+ head?: never;
189
+ patch?: never;
190
+ trace?: never;
191
+ };
192
+ "/site/{domain}/try": {
193
+ parameters: {
194
+ query?: never;
195
+ header?: never;
196
+ path?: never;
197
+ cookie?: never;
198
+ };
199
+ get?: never;
200
+ put?: never;
201
+ /**
202
+ * Mint a SANDBOX test verification session for the selection
203
+ * @description Creates a real SANDBOX verification session under the signed-in member's personal organization for the selected data points, so they can test the flow on `/v/{sessionId}` without registering a callback subscription. Requires a signed-in member (session cookie); the provider set is recomputed server-side from the selection.
204
+ */
205
+ post: operations["SiteBuildTry"];
206
+ delete?: never;
207
+ options?: never;
208
+ head?: never;
209
+ patch?: never;
210
+ trace?: never;
211
+ };
212
+ "/site/{domain}/repair": {
213
+ parameters: {
214
+ query?: never;
215
+ header?: never;
216
+ path?: never;
217
+ cookie?: never;
218
+ };
219
+ /**
220
+ * Failure-aware "Repair with an AI coding agent" wizard fragment
221
+ * @description Body of the build page's repair dialog, lazy-loaded after a sandbox Try fails so the agent prompt includes the REAL failure (which provider(s) failed + the error reason, read from the session's event log) and the resolved provider set. HTML / HTMX fragment.
222
+ */
223
+ get: operations["SiteBuildRepair"];
224
+ put?: never;
225
+ post?: never;
226
+ delete?: never;
227
+ options?: never;
228
+ head?: never;
229
+ patch?: never;
230
+ trace?: never;
231
+ };
232
+ "/site/{domain}/alternative": {
233
+ parameters: {
234
+ query?: never;
235
+ header?: never;
236
+ path?: never;
237
+ cookie?: never;
238
+ };
239
+ /**
240
+ * Re-resolve excluding a failed provider, else hand off to repair
241
+ * @description After a sandbox Try fails, reads which provider(s) failed from the session analytics and re-resolves the selection with them excluded. If the rest still cover it, responds with an `HX-Redirect` to the build page (failed providers excluded — the alternative set). Otherwise emits an `openRepair` HX-Trigger so the client opens the repair wizard.
242
+ */
243
+ get: operations["SiteBuildAlternative"];
244
+ put?: never;
245
+ post?: never;
246
+ delete?: never;
247
+ options?: never;
248
+ head?: never;
249
+ patch?: never;
250
+ trace?: never;
251
+ };
252
+ "/discover/teach": {
253
+ parameters: {
254
+ query?: never;
255
+ header?: never;
256
+ path?: never;
257
+ cookie?: never;
258
+ };
259
+ /**
260
+ * “Teach our agent” instructions for a missing website / data point
261
+ * @description Returns the "Teach our agent" panel shown when a website or data point a user wants does not exist yet: steps to install the Reclaim MCP server plus a ready-to-copy prompt, templated with the requested `domain` and (optionally) `dataPoint`, that instructs an agent to author the missing verification. HTML / HTMX only (a dialog fragment).
262
+ */
263
+ get: operations["DiscoverTeachAgent"];
264
+ put?: never;
265
+ post?: never;
266
+ delete?: never;
267
+ options?: never;
268
+ head?: never;
269
+ patch?: never;
270
+ trace?: never;
271
+ };
272
+ "/discover/resolve": {
273
+ parameters: {
274
+ query?: never;
275
+ header?: never;
276
+ path?: never;
277
+ cookie?: never;
278
+ };
279
+ /**
280
+ * Resolve a website + data points to verification providers
281
+ * @description Provider resolution: given a website and the data points the user wants their users to prove, return the smallest set of existing providers whose data points COVER the selection (greedy combine), the `requiredContext` inputs the consumer must supply, and any `uncovered` points no provider exposes yet (`needsCreation` is true then — author a provider with the agent tools). When the chosen providers can be fused into one (same start page, no clashing page scripts) `merge.mergeable` is true.
282
+ *
283
+ * Agent flow: pick a website (`GET /discover/data-points` lists what's verifiable there), confirm the data points with the user, call this to get the `providers` + `requiredContext`, collect those context values from the user, then `POST /verifications/sessions` with `providers` (pass every id) and `context` to mint a verification.
284
+ */
285
+ get: operations["DiscoverResolve"];
286
+ put?: never;
287
+ post?: never;
288
+ delete?: never;
289
+ options?: never;
290
+ head?: never;
291
+ patch?: never;
292
+ trace?: never;
293
+ };
294
+ "/discover/data-points": {
295
+ parameters: {
296
+ query?: never;
297
+ header?: never;
298
+ path?: never;
299
+ cookie?: never;
300
+ };
301
+ /**
302
+ * List the verifiable data points on a website
303
+ * @description The data points existing providers can prove on a website — the menu to pick from before `GET /discover/resolve`. Optionally filter by `q`.
304
+ */
305
+ get: operations["DiscoverDataPoints"];
306
+ put?: never;
307
+ post?: never;
308
+ delete?: never;
309
+ options?: never;
310
+ head?: never;
311
+ patch?: never;
312
+ trace?: never;
313
+ };
105
314
  "/providers/{providerId}/preview.png": {
106
315
  parameters: {
107
316
  query?: never;
@@ -393,6 +602,26 @@ export interface paths {
393
602
  patch?: never;
394
603
  trace?: never;
395
604
  };
605
+ "/v/{sessionId}/dispose": {
606
+ parameters: {
607
+ query?: never;
608
+ header?: never;
609
+ path?: never;
610
+ cookie?: never;
611
+ };
612
+ get?: never;
613
+ put?: never;
614
+ /**
615
+ * Dispose the session's remote browser
616
+ * @description Tears down the Popcorn remote-browser session backing this verification and cancels any in-flight run. Called by the verification page's "close" button (and safe to call after a session is already terminal — the dispose is idempotent). Popcorn sessions are a scarce, expensive resource, so freeing them promptly rather than waiting for their TTL matters. Same model as the status fragment: possession of the session id; no body.
617
+ */
618
+ post: operations["DisposeVerificationSession"];
619
+ delete?: never;
620
+ options?: never;
621
+ head?: never;
622
+ patch?: never;
623
+ trace?: never;
624
+ };
396
625
  "/v/{sessionId}/sse": {
397
626
  parameters: {
398
627
  query?: never;
@@ -564,8 +793,7 @@ export interface paths {
564
793
  delete?: never;
565
794
  options?: never;
566
795
  head?: never;
567
- /** Update the authenticated user's profile */
568
- patch: operations["UpdateMe"];
796
+ patch?: never;
569
797
  trace?: never;
570
798
  };
571
799
  "/users/{userId}": {
@@ -641,7 +869,11 @@ export interface paths {
641
869
  path?: never;
642
870
  cookie?: never;
643
871
  };
644
- get?: never;
872
+ /**
873
+ * List organization members, optionally filtered by email
874
+ * @description Returns the organization's members, optionally filtered by an email substring (`q`). Renders the members-list fragment for the org page's live filter; same visibility as the org page.
875
+ */
876
+ get: operations["SearchOrgMembers"];
645
877
  put?: never;
646
878
  /**
647
879
  * Invite a member to an organization
@@ -739,7 +971,7 @@ export interface paths {
739
971
  patch: operations["UpdateTheme"];
740
972
  trace?: never;
741
973
  };
742
- "/orgs/{orgId}/credential": {
974
+ "/orgs/{orgId}/keypair": {
743
975
  parameters: {
744
976
  query?: never;
745
977
  header?: never;
@@ -747,21 +979,21 @@ export interface paths {
747
979
  cookie?: never;
748
980
  };
749
981
  /**
750
- * Get the organization's encryption credential
751
- * @description Returns the organization's single X25519 encryption credential — the public JWK the Builder uses to JWE-encrypt delivered results — or `404` when none is set (delivery is plaintext in that case). Authenticated by the org's `OrgToken` or a human `BearerAuth` session for an active member of the org.
982
+ * Get the organization's encryption keypair
983
+ * @description Returns the organization's single Ethereum (secp256k1) encryption keypair — its public JWK, derived eth address, and `canEncryptResult` flag — or `404` when none is set (the org is keyless ⇒ plaintext delivery). Authenticated by the org's `OrgToken` or a human `BearerAuth` session for an active member of the org.
752
984
  */
753
- get: operations["GetOrgCredential"];
985
+ get: operations["GetOrgKeypair"];
754
986
  /**
755
- * Set (or replace) the organization's encryption credential
756
- * @description Upserts the organization's single X25519 encryption credential. The body carries the org's **encryption public JWK** (`{kty:'OKP', crv:'X25519', x}`); the matching private key never leaves the consumer. Replacing overwrites the single row. Once set, terminal results are delivered as a compact JWE encrypted to this key; clear it to revert to plaintext delivery. Authenticated by the org's `OrgToken` or a human `BearerAuth` session for an active member of the org.
987
+ * Set (or rotate) the organization's encryption keypair
988
+ * @description Upserts the organization's single Ethereum (secp256k1) encryption keypair. The body carries the org's **eth public key** — as an uncompressed hex string (`0x04`+128 hex) or a secp256k1 public JWK (`{kty:'EC', crv:'secp256k1', x, y}`) — and `canEncryptResult`. The matching private key never leaves the consumer. Setting overwrites the single row (and creates it for a keyless org). When `canEncryptResult` is true, terminal results are delivered as an ECIES ciphertext encrypted to this key; otherwise plaintext. Authenticated by the org's `OrgToken` or a human `BearerAuth` session for an active member of the org.
757
989
  */
758
- put: operations["SetOrgCredential"];
990
+ put: operations["SetOrgKeypair"];
759
991
  post?: never;
760
992
  /**
761
- * Clear the organization's encryption credential
762
- * @description Removes the organization's encryption credential. After this, terminal results are delivered as plaintext until a new credential is set. Authenticated by the org's `OrgToken` or a human `BearerAuth` session for an active member of the org.
993
+ * Clear the organization's encryption keypair
994
+ * @description Removes the organization's encryption keypair (the org reverts to keyless ⇒ plaintext delivery, and loses its eth identity address) until a new keypair is set. Authenticated by the org's `OrgToken` or a human `BearerAuth` session for an active member of the org.
763
995
  */
764
- delete: operations["DeleteOrgCredential"];
996
+ delete: operations["DeleteOrgKeypair"];
765
997
  options?: never;
766
998
  head?: never;
767
999
  patch?: never;
@@ -879,6 +1111,26 @@ export interface paths {
879
1111
  patch?: never;
880
1112
  trace?: never;
881
1113
  };
1114
+ "/attach": {
1115
+ parameters: {
1116
+ query?: never;
1117
+ header?: never;
1118
+ path?: never;
1119
+ cookie?: never;
1120
+ };
1121
+ /**
1122
+ * Device-pairing landing page
1123
+ * @description Page where a user enters the 5-character pairing code shown by their CLI / MCP. Submitting the form (`?code=`) redirects to the canonical `/attach/{code}` page; an invalid code re-renders the form with an error.
1124
+ */
1125
+ get: operations["AttachLanding"];
1126
+ put?: never;
1127
+ post?: never;
1128
+ delete?: never;
1129
+ options?: never;
1130
+ head?: never;
1131
+ patch?: never;
1132
+ trace?: never;
1133
+ };
882
1134
  "/attach/{code}": {
883
1135
  parameters: {
884
1136
  query?: never;
@@ -1195,9 +1447,9 @@ export interface paths {
1195
1447
  * the presented `OrgToken` resolves to. The body is just `callbackUrl`
1196
1448
  * and `events`. At least one subscription must exist for the org before a
1197
1449
  * verification session can be created. Delivery is scoped by org: terminal
1198
- * results are encrypted as a compact JWE to the org's encryption
1199
- * credential when set (see `PUT /orgs/{orgId}/credential`), else delivered
1200
- * as plaintext.
1450
+ * results are ECIES-encrypted to the org's eth public key when its
1451
+ * `canEncryptResult` is enabled (see `PUT /orgs/{orgId}/keypair`), else
1452
+ * delivered as plaintext.
1201
1453
  */
1202
1454
  post: operations["CreateCallbackSubscription"];
1203
1455
  delete?: never;
@@ -1391,8 +1643,8 @@ export interface paths {
1391
1643
  cookie?: never;
1392
1644
  };
1393
1645
  /**
1394
- * Get the resolved provider recipe for a session
1395
- * @description Returns the resolved provider version's `initialUrl` + `requests` for this session — what the Verification Client needs to run it. Authorized for the Verification Client (`X-VC-Token` service token) or the session creator (authenticated by the consumer's `OrgToken`; the resolved org must match the session), so it works regardless of the provider's visibility (unlike `GetProvider`, which 404s on PRIVATE providers for non-members).
1646
+ * Get the resolved provider recipes for a session
1647
+ * @description Returns the session's resolved provider versions' recipes (`initialUrl` + `requests` per provider), in run order — what the Verification Client needs to run the session (each provider sequentially in one browser session). Authorized for the Verification Client (`X-VC-Token` service token) or the session creator (authenticated by the consumer's `OrgToken`; the resolved org must match the session), so it works regardless of the provider's visibility (unlike `GetProvider`, which 404s on PRIVATE providers for non-members).
1396
1648
  */
1397
1649
  get: operations["GetVerificationRecipe"];
1398
1650
  put?: never;
@@ -1501,7 +1753,7 @@ export interface paths {
1501
1753
  };
1502
1754
  /**
1503
1755
  * List callback encryption keys for a session
1504
- * @description Used by the Verification Client (X-VC-Token) after the terminal event: returns the session org's callback subscriptions that subscribe to that terminal event. Each item carries the org's `publicKeyJwk` (X25519) to JWE-encrypt the result to, or none (deliver plaintext).
1756
+ * @description Used by the Verification Client (X-VC-Token) after the terminal event: returns the session org's callback subscriptions that subscribe to that terminal event. Each item carries the org's `publicKeyJwk` (secp256k1) to ECIES-encrypt the result to when the org's `canEncryptResult` is enabled, or none (deliver plaintext).
1505
1757
  */
1506
1758
  get: operations["ListSessionCallbackKeys"];
1507
1759
  put?: never;
@@ -1527,7 +1779,7 @@ export interface paths {
1527
1779
  put?: never;
1528
1780
  /**
1529
1781
  * Submit the signed, encrypted verification result
1530
- * @description Used by the Verification Client (X-VC-Token) to submit the result after a terminal event. The VC signs the JWS and JWE-encrypts it (ECDH-ES + A256GCM over X25519) to the org's encryption key (from the callback-keys endpoint); it submits one payload per subscription. The Builder stores each payload, enqueues it for the delivery worker (retry → DLQ), and never sees the plaintext. The Verification Client does not contact the Consumer.
1782
+ * @description Used by the Verification Client (X-VC-Token) to submit the result after a terminal event. The VC signs the JWS and, when the org's `canEncryptResult` is enabled, ECIES-encrypts it to the org's eth public key (from the callback-keys endpoint); it submits one payload per subscription. The Builder stores each payload, enqueues it for the delivery worker (retry → DLQ), and never sees the plaintext. The Verification Client does not contact the Consumer.
1531
1783
  */
1532
1784
  post: operations["SubmitVerificationResult"];
1533
1785
  delete?: never;
@@ -1618,18 +1870,18 @@ export interface webhooks {
1618
1870
  * `timestamp` are *plaintext routing hints* so the consumer can
1619
1871
  * route and dedupe before doing any crypto. Everything derived
1620
1872
  * from the end-user (claims, extracted parameters, proofs,
1621
- * context) is inside `data`: a compact JWE wrapping the signed JWS
1622
- * result when the org has an encryption credential, else the
1873
+ * context) is inside `data`: an ECIES ciphertext wrapping the signed JWS
1874
+ * result when the org's `canEncryptResult` is enabled, else the
1623
1875
  * plaintext signed JWS. The envelope is **not authenticated** —
1624
1876
  * act only on the decrypted and signature-verified JWS contents,
1625
1877
  * and check that its `reclaimSessionId` matches the session you
1626
1878
  * expect.
1627
1879
  *
1628
- * **Decrypting `data`.** When the org has registered an encryption
1629
- * credential, `data` is a compact JWE (RFC 7516,
1630
- * `ECDH-ES+A256GCM` over X25519); decrypt it with the matching
1631
- * X25519 private key (e.g. `jose` `compactDecrypt`) to recover the
1632
- * inner JWS. When no credential is set, `data` is the JWS directly.
1880
+ * **Decrypting `data`.** When the org's `canEncryptResult` is enabled,
1881
+ * `data` is an ECIES ciphertext (base64url, secp256k1 + AES-256-GCM);
1882
+ * decrypt it with the matching eth private key to recover the inner
1883
+ * JWS. When the org is keyless or the flag is off, `data` is the JWS
1884
+ * directly.
1633
1885
  * The JWS is an RFC 7515 result in General JSON serialization
1634
1886
  * (`alg: ES256K`); verify it against
1635
1887
  * `GET /.well-known/jwks.json` (`kid` = the signer's ETH address).
@@ -1856,8 +2108,8 @@ export interface components {
1856
2108
  providers?: components["schemas"]["ProviderListItem"][];
1857
2109
  /** @description Themes owned by this organization. */
1858
2110
  themes?: components["schemas"]["Theme"][];
1859
- /** @description The organization's single X25519 encryption credential, if set. Only populated on the org-detail endpoint and only visible to active members. Absent ⇒ results are delivered as plaintext. */
1860
- credential?: components["schemas"]["OrgCredential"];
2111
+ /** @description The organization's single Ethereum (secp256k1) encryption keypair, if set. Only populated on the org-detail endpoint and only visible to active members. Absent ⇒ the org is keyless and results are delivered as plaintext. */
2112
+ keypair?: components["schemas"]["OrgKeypair"];
1861
2113
  /** @description Billing record attached to the org, if any. Owner-visible only; absent for members. Presence promotes the org to production mode. */
1862
2114
  billing?: components["schemas"]["OrgBilling"];
1863
2115
  createMetadata: components["schemas"]["ActorMetadata"];
@@ -1888,26 +2140,43 @@ export interface components {
1888
2140
  */
1889
2141
  status: components["schemas"]["EntityStatus"];
1890
2142
  };
1891
- /** @description An X25519 public key in JWK form (RFC 8037 OKP), used to JWE-encrypt delivered verification results. The matching private key never leaves the consumer. */
1892
- JwkX25519Public: {
2143
+ /** @description A secp256k1 (Ethereum) public key in JWK form (`{kty:'EC', crv:'secp256k1', x, y}`), used to ECIES-encrypt delivered verification results and to identify the org. The matching private key never leaves the consumer. Same shape published by the signing JWKS. */
2144
+ JwkSecp256k1Public: {
1893
2145
  /** @enum {string} */
1894
- kty: "OKP";
2146
+ kty: "EC";
1895
2147
  /** @enum {string} */
1896
- crv: "X25519";
1897
- /** @description base64url-encoded public key bytes. */
2148
+ crv: "secp256k1";
2149
+ /** @description base64url-encoded X coordinate (32 bytes). */
1898
2150
  x: string;
1899
- };
1900
- /** @description An organization's single encryption credential: the X25519 public JWK the Builder uses to JWE-encrypt delivered results. One per org, replaceable via `PUT /orgs/{orgId}/credential`. Absent ⇒ results are delivered as plaintext. */
1901
- OrgCredential: {
1902
- publicKeyJwk: components["schemas"]["JwkX25519Public"];
1903
- /** @description Optional human-readable label set when the credential was stored. */
2151
+ /** @description base64url-encoded Y coordinate (32 bytes). */
2152
+ y: string;
2153
+ };
2154
+ /** @description An organization's single Ethereum (secp256k1) encryption keypair: the public JWK, its derived eth address (which also identifies the org), and the `canEncryptResult` toggle. One per org, set/rotated via `PUT /orgs/{orgId}/keypair`. Absent ⇒ the org is keyless (plaintext delivery). */
2155
+ OrgKeypair: {
2156
+ publicKeyJwk: components["schemas"]["JwkSecp256k1Public"];
2157
+ /** @description Lowercase 0x eth address derived from the public key. */
2158
+ ethAddress: string;
2159
+ /** @description When true, terminal results are ECIES-encrypted to this key; when false (the default), they are delivered as plaintext. */
2160
+ canEncryptResult: boolean;
2161
+ /** @description Optional human-readable label set when the keypair was stored. */
1904
2162
  label?: string;
1905
2163
  createMetadata: components["schemas"]["ActorMetadata"];
1906
2164
  updateMetadata: components["schemas"]["ActorMetadata"];
1907
2165
  };
1908
- /** @description Body for `PUT /orgs/{orgId}/credential`. */
1909
- OrgCredentialRequest: {
1910
- publicKeyJwk: components["schemas"]["JwkX25519Public"];
2166
+ OrgKeypairRequest: components["schemas"]["OrgKeypairHexRequest"] | components["schemas"]["OrgKeypairJwkRequest"];
2167
+ /** @description Body for `PUT /orgs/{orgId}/keypair`. Carries the org's eth public key as an uncompressed hex string (`0x04` + 128 hex) — the eth-native form wallets/ethers emit. The matching private key never leaves the consumer. */
2168
+ OrgKeypairHexRequest: {
2169
+ /** @description Uncompressed secp256k1 public key, `0x04` + 128 hex. */
2170
+ publicKey: string;
2171
+ /** @default false */
2172
+ canEncryptResult: boolean;
2173
+ label?: string;
2174
+ };
2175
+ /** @description Body for `PUT /orgs/{orgId}/keypair`. Carries the org's eth public key as a secp256k1 public JWK. */
2176
+ OrgKeypairJwkRequest: {
2177
+ publicKeyJwk: components["schemas"]["JwkSecp256k1Public"];
2178
+ /** @default false */
2179
+ canEncryptResult: boolean;
1911
2180
  label?: string;
1912
2181
  };
1913
2182
  /** @description Response of `POST /orgs/{orgId}/token`. The plaintext `orgSecret` is shown **only once** here; the server stores only its HMAC. Use it as `Authorization: Bearer <orgSecret>` (the `OrgToken` scheme). */
@@ -1993,8 +2262,10 @@ export interface components {
1993
2262
  writeRedactionMode?: components["schemas"]["WriteRedactionMode"];
1994
2263
  /** @description Apply TLS configuration when creating the tunnel to the attestor. */
1995
2264
  additionalClientOptions?: components["schemas"]["AdditionalTlsClientOptions"];
1996
- /** @description A list of match conditions for the response. */
1997
- matches?: components["schemas"]["ResponseMatch"][];
2265
+ /** @description Conditions the (redacted) response must satisfy for the proof to be valid. Each runs against the union of the portions revealed by `responseRedactions` (or the whole response when there are none). Mirrors attestor-core `responseMatches`. */
2266
+ responseMatches?: components["schemas"]["ResponseMatch"][];
2267
+ /** @description Portions to select/reveal from the response, applied in order (xPath => jsonPath => regex). Done client-side; only the selected portions (plus the first response line) are sent to the attestor. An independent ordered list — NOT paired 1:1 with `responseMatches`. Mirrors attestor-core `responseRedactions`. */
2268
+ responseRedactions?: components["schemas"]["ResponseRedaction"][];
1998
2269
  };
1999
2270
  /** @description A template for selecting request */
2000
2271
  RequestSelectionTemplate: components["schemas"]["RequestSelection"] & {
@@ -2042,11 +2313,9 @@ export interface components {
2042
2313
  type: "regex" | "contains";
2043
2314
  /** @description The pattern or value to look for in the response. When `type` is 'contains', supports template variable declaration using `{{variable}}` syntax. When `type` is 'regex', can be used to extract variables using regex named groups. */
2044
2315
  value: string;
2045
- /** @description Optional extractor describing which portion of the response to pin to the proof. When absent, the match runs against the raw response body. */
2046
- extract?: components["schemas"]["ExtractDataSpecifier"];
2047
2316
  };
2048
2317
  /** @description Which portions to select from a response. These are selected in order, xpath => jsonPath => regex * These redactions are done client side and only the selected portions are sent to the attestor. The attestor will only be able to see the selected portions alongside the first line of the HTTP response (i.e. "HTTP/1.1 200 OK") */
2049
- ExtractDataSpecifier: {
2318
+ ResponseRedaction: {
2050
2319
  /** @description expect an HTML response, and to contain a certain xpath for eg. "/html/body/div.a1/div.a2/span.a5" */
2051
2320
  xPath?: string;
2052
2321
  /** @description expect a JSON response, retrieve the item at this path using dot notation for e.g. 'email.addresses.0' */
@@ -2222,6 +2491,43 @@ export interface components {
2222
2491
  primaryDataPoint?: string;
2223
2492
  dataPoints: string[];
2224
2493
  };
2494
+ /** @description One website (distinct domain) in the Discover search results. Aggregates, across every verification the caller can see on that domain, the brand display fields and the union of provable data points. */
2495
+ WebsiteSuggestion: {
2496
+ /**
2497
+ * Format: hostname
2498
+ * @description Canonical root domain (e.g. `github.com`).
2499
+ */
2500
+ domain: string;
2501
+ /** @description Display name for the website (scraped site name or derived from the domain). */
2502
+ brandName: string;
2503
+ /**
2504
+ * Format: uri
2505
+ * @description Favicon URL for the website.
2506
+ */
2507
+ iconUrl?: string;
2508
+ /** @description Deduplicated names of every data point provable for this website. */
2509
+ dataPoints: string[];
2510
+ /** @description Number of verifications backing this website that the caller can see. */
2511
+ providerCount: number;
2512
+ };
2513
+ /** @description Body for `POST /site/{domain}/try`. Only the verification `context` (values for the resolved providers' `requiredContext` inputs). The selection (dataPoints / mode / pins) travels in the query string. */
2514
+ SiteBuildTryBody: {
2515
+ /** @description Input key → value the consumer's app supplies. */
2516
+ context?: {
2517
+ [key: string]: string;
2518
+ };
2519
+ };
2520
+ /** @description A single data point selectable on the `/site/{domain}` page, with how many visible verifications expose it and one example verification slug. */
2521
+ DataPointItem: {
2522
+ /** @description Data-point name (e.g. `username`, `followers_count`). */
2523
+ name: string;
2524
+ /** @description Human description of the data point, taken from the response match that declares it. Absent when no match supplies one. */
2525
+ description?: string;
2526
+ /** @description Number of visible verifications on the domain that expose this data point. */
2527
+ providerCount: number;
2528
+ /** @description Slug of one verification that exposes this data point. */
2529
+ exampleProviderSlug?: string;
2530
+ };
2225
2531
  InterceptorOptions: {
2226
2532
  /**
2227
2533
  * @description How traffic interception is implemented.
@@ -2412,12 +2718,16 @@ export interface components {
2412
2718
  /** @description Opaque bearer token. Send as `Authorization: Bearer <token>` on every authenticated request. */
2413
2719
  token: string;
2414
2720
  };
2415
- /** @description Caller-editable fields on the authenticated user. */
2416
- UpdateUserRequest: {
2417
- name?: string;
2418
- };
2721
+ /** @description Body for `POST /orgs`. Explicitly-created orgs must declare their Ethereum (secp256k1) encryption public key — it identifies the org and, when `canEncryptResult` is enabled, encrypts delivered results. */
2419
2722
  CreateOrgRequest: {
2420
2723
  name: string;
2724
+ /** @description The org's eth public key, uncompressed hex (`0x04` + 128 hex) — the eth-native form wallets/ethers emit. The matching private key never leaves the consumer. */
2725
+ publicKey: string;
2726
+ /**
2727
+ * @description When true, terminal results are ECIES-encrypted to this key; when false (the default), they are delivered as plaintext.
2728
+ * @default false
2729
+ */
2730
+ canEncryptResult: boolean;
2421
2731
  };
2422
2732
  UpdateOrgRequest: {
2423
2733
  name?: string;
@@ -2607,9 +2917,10 @@ export interface components {
2607
2917
  * @description Lifecycle event reported for a verification session. A healthy run
2608
2918
  * proceeds through these in order; reading the gaps locates where a
2609
2919
  * session stalled. Session-level terminal events trigger callback
2610
- * delivery; request-level events are progress pings carrying a
2611
- * `request_id` in their event data. New values may be added over time;
2612
- * clients MUST tolerate unknown values in responses.
2920
+ * delivery; provider-/request-level events are progress pings carrying a
2921
+ * `provider_id` (and `request_id` for request-level ones) in their event
2922
+ * data. New values may be added over time; clients MUST tolerate unknown
2923
+ * values in responses.
2613
2924
  *
2614
2925
  * - `session_pending`: Session created; awaiting the end-user.
2615
2926
  *
@@ -2618,6 +2929,10 @@ export interface components {
2618
2929
  *
2619
2930
  * - `verification_client_ready`: The client initialized.
2620
2931
  *
2932
+ * - `verification_provider_started`: The client began verifying a provider
2933
+ * (`provider_id`/`resolved_version`/`ordinal` in `eventData`). One per
2934
+ * provider, in run order, for multi-provider sessions.
2935
+ *
2621
2936
  * - `request_matched`: The target request was captured on the provider
2622
2937
  * site. Absent (after opened) ⇒ the user didn't complete the journey.
2623
2938
  *
@@ -2638,7 +2953,7 @@ export interface components {
2638
2953
  * - `session_expired`: `expiresAt` passed before a terminal event.
2639
2954
  * @enum {string}
2640
2955
  */
2641
- VerificationEvent: "session_pending" | "verification_client_opened" | "verification_client_ready" | "request_matched" | "request_claim_created" | "request_claim_completed" | "request_claim_rejected" | "request_claim_failed" | "verification_success" | "verification_rejected" | "verification_error" | "session_expired";
2956
+ VerificationEvent: "session_pending" | "verification_client_opened" | "verification_client_ready" | "verification_provider_started" | "request_matched" | "request_claim_created" | "request_claim_completed" | "request_claim_rejected" | "request_claim_failed" | "verification_success" | "verification_rejected" | "verification_error" | "session_expired";
2642
2957
  /**
2643
2958
  * @description Status of a verification session, derived from its events. New values
2644
2959
  * may be added over time; clients MUST tolerate unknown values in
@@ -2675,7 +2990,7 @@ export interface components {
2675
2990
  * @enum {string}
2676
2991
  */
2677
2992
  CallbackDeliveryStatus: "pending" | "delivered" | "attempt_failed" | "failed";
2678
- /** @description A pre-registered destination for verification results, owned by an organization. A session's results go to every subscription on the session's org whose `events` include the terminal event. At least one subscription must exist for the org before a session can be created. Terminal results are encrypted as a compact JWE to the org's encryption credential when set (see `OrgCredential`), else delivered as plaintext. */
2993
+ /** @description A pre-registered destination for verification results, owned by an organization. A session's results go to every subscription on the session's org whose `events` include the terminal event. At least one subscription must exist for the org before a session can be created. Terminal results are ECIES-encrypted to the org's eth public key when its `canEncryptResult` is enabled (see `OrgKeypair`), else delivered as plaintext. */
2679
2994
  CallbackSubscription: {
2680
2995
  /** Format: uuid */
2681
2996
  id: string;
@@ -2718,11 +3033,8 @@ export interface components {
2718
3033
  * @description UUID v7 session id (also echoed in context as `reclaimSessionId`).
2719
3034
  */
2720
3035
  id: string;
2721
- providerId: components["schemas"]["ProviderID"];
2722
- /** @description Version constraint requested by the Consumer (empty = latest). */
2723
- version?: string;
2724
- /** @description Exact version resolved at creation time. */
2725
- resolvedVersion: string;
3036
+ /** @description The providers this session verifies, in run order. The Verification Client runs each (sequentially, in one browser session) and submits one combined result; all are required. */
3037
+ providers: components["schemas"]["SessionProvider"][];
2726
3038
  /** @description The organization that owns this session. */
2727
3039
  orgId?: components["schemas"]["OrgID"];
2728
3040
  /**
@@ -2749,16 +3061,29 @@ export interface components {
2749
3061
  mode: components["schemas"]["CredentialMode"];
2750
3062
  sandboxLimits?: components["schemas"]["SandboxLimits"];
2751
3063
  };
2752
- /** @description Body for `POST /verifications/sessions`. Authenticated by the consumer's `OrgToken`. Carries no callback URLs — they come from the org's callback subscriptions. */
2753
- CreateVerificationSessionRequest: {
3064
+ /** @description One provider a session verifies, with its resolved version. */
3065
+ SessionProvider: {
3066
+ providerId: components["schemas"]["ProviderID"];
3067
+ /** @description Version constraint requested by the Consumer (empty = latest). */
3068
+ version?: string;
3069
+ /** @description Exact version resolved at creation time. */
3070
+ resolvedVersion: string;
3071
+ };
3072
+ /** @description A provider (+ optional version) to verify in a session. */
3073
+ SessionProviderInput: {
2754
3074
  providerId: components["schemas"]["ProviderID"];
2755
3075
  /** @description Semver constraint; empty resolves to the latest trunk version. */
2756
3076
  version?: string;
2757
- /** @description Consumer context. Validated against the resolved provider version's `requiredContext` JSON Schema (a 400 is returned on mismatch); extra fields are always allowed. Recipe requests reference these values as `{{context.<key>}}`. Echoed back (plus `reclaimSessionId`) in the result. */
3077
+ };
3078
+ /** @description Body for `POST /verifications/sessions`. Authenticated by the consumer's `OrgToken`. Carries no callback URLs — they come from the org's callback subscriptions. The one shared `context` is validated against every provider's `requiredContext`. */
3079
+ CreateVerificationSessionRequest: {
3080
+ /** @description Providers to verify, in run order. The Verification Client runs each sequentially in one browser session and submits one combined result; all are required. */
3081
+ providers: components["schemas"]["SessionProviderInput"][];
3082
+ /** @description Consumer context, shared by all providers. Validated against EACH resolved provider version's `requiredContext` JSON Schema (a 400 is returned on mismatch); extra fields are always allowed. Recipe requests reference these values as `{{context.<key>}}`. Echoed back (plus `reclaimSessionId`) in the result. */
2758
3083
  context: {
2759
3084
  [key: string]: unknown;
2760
3085
  };
2761
- /** @description Must contain a `{sessionId}` placeholder. */
3086
+ /** @description Must contain a `{sessionId}` placeholder. Must be an http(s) URL. */
2762
3087
  verificationClientUrl: string;
2763
3088
  };
2764
3089
  /** @description Body for `POST /verifications/sessions/{sessionId}/events`. Status ping only — never carries the proof (use the result endpoint for that). */
@@ -2802,7 +3127,7 @@ export interface components {
2802
3127
  /** @description The event that produced this delivery. */
2803
3128
  event: components["schemas"]["VerificationEvent"];
2804
3129
  timestamp: components["schemas"]["Timestamp"];
2805
- /** @description Payload interpreted per `event`. Terminal events: the signed result — a **compact JWE** (RFC 7516, `ECDH-ES+A256GCM` over X25519) wrapping the signed JWS when the org has an encryption credential (decrypt with the matching X25519 private key to recover the inner JWS), else the JWS directly; the inner JWS parses as the `Jws` schema with payload `VerificationResultPayload`. Non-terminal events: plaintext JSON `{ event, eventData }` (unsigned). */
3130
+ /** @description Payload interpreted per `event`. Terminal events: the signed result — an **ECIES ciphertext** (base64url, secp256k1 + AES-256-GCM) wrapping the signed JWS when the org's `canEncryptResult` is enabled (decrypt with the matching eth private key to recover the inner JWS), else the JWS directly; the inner JWS parses as the `Jws` schema with payload `VerificationResultPayload`. Non-terminal events: plaintext JSON `{ event, eventData }` (unsigned). */
2806
3131
  data: string;
2807
3132
  };
2808
3133
  /** @description The decoded JWS payload of a delivered verification result (the JWS itself is the `Jws` schema, signed ES256K by the key published at `/.well-known/jwks.json`). Consumers MUST check `reclaimSessionId` against the session they created and `verification_session.status` for the outcome. `results` is present on success; `problem` (RFC 9457 shape) is set when the run failed. */
@@ -2821,8 +3146,13 @@ export interface components {
2821
3146
  verification_session: {
2822
3147
  /** @enum {string} */
2823
3148
  status: "success" | "rejected" | "error";
2824
- provider_id: components["schemas"]["ProviderID"];
2825
- resolved_version: string;
3149
+ /** @description The providers verified in this session, in run order. */
3150
+ providers: ({
3151
+ provider_id: components["schemas"]["ProviderID"];
3152
+ resolved_version: string;
3153
+ } & {
3154
+ [key: string]: unknown;
3155
+ })[];
2826
3156
  /** Format: uuid */
2827
3157
  org_id?: string | null;
2828
3158
  /** Format: uuid */
@@ -2831,19 +3161,26 @@ export interface components {
2831
3161
  } & {
2832
3162
  [key: string]: unknown;
2833
3163
  };
2834
- /** @description One entry per proven request (success only). */
3164
+ /** @description One entry per verified provider (success only), in run order. Each carries that provider's proven requests. */
2835
3165
  results?: ({
2836
- request_id?: string;
2837
- url?: string;
2838
- method?: string;
2839
- extracted_parameters?: {
3166
+ provider_id: components["schemas"]["ProviderID"];
3167
+ resolved_version: string;
3168
+ /** @description One entry per proven request for this provider. */
3169
+ requests: ({
3170
+ request_id?: string;
3171
+ url?: string;
3172
+ method?: string;
3173
+ extracted_parameters?: {
3174
+ [key: string]: unknown;
3175
+ };
3176
+ content_hash?: string;
3177
+ identifier?: string;
3178
+ owner?: string;
3179
+ /** @description Base64url-encoded nested JWS (attestor proof). */
3180
+ proof?: unknown;
3181
+ } & {
2840
3182
  [key: string]: unknown;
2841
- };
2842
- content_hash?: string;
2843
- identifier?: string;
2844
- owner?: string;
2845
- /** @description Base64url-encoded nested JWS (attestor proof). */
2846
- proof?: unknown;
3183
+ })[];
2847
3184
  } & {
2848
3185
  [key: string]: unknown;
2849
3186
  })[];
@@ -2854,18 +3191,18 @@ export interface components {
2854
3191
  } & {
2855
3192
  [key: string]: unknown;
2856
3193
  };
2857
- /** @description A callback subscription's delivery key, returned to the Verification Client. When `publicKeyJwk` is present the VC JWE-encrypts the result (ECDH-ES + A256GCM over X25519) for that org; when absent the VC submits the plaintext signed JWS. */
3194
+ /** @description A callback subscription's delivery key, returned to the Verification Client. When `publicKeyJwk` is present the VC ECIES-encrypts the result for that org (its `canEncryptResult` is enabled); when absent the VC submits the plaintext signed JWS. */
2858
3195
  CallbackKey: {
2859
3196
  /** Format: uuid */
2860
3197
  subscriptionId: string;
2861
- /** @description X25519 public JWK to JWE-encrypt the result to. Absent ⇒ deliver plaintext. */
2862
- publicKeyJwk?: components["schemas"]["JwkX25519Public"];
3198
+ /** @description The org's secp256k1 (eth) public JWK to ECIES-encrypt the result to. Absent ⇒ deliver plaintext. */
3199
+ publicKeyJwk?: components["schemas"]["JwkSecp256k1Public"];
2863
3200
  };
2864
- /** @description One result payload for one callback subscription. The Verification Client signs the JWS and, when the org has an encryption credential, JWE-encrypts it (ECDH-ES + A256GCM over X25519); otherwise it submits the plaintext JWS. Either way the payload is carried in `payload` and the Builder stores + delivers it as a blind relay. */
3201
+ /** @description One result payload for one callback subscription. The Verification Client signs the JWS and, when the org's `canEncryptResult` is enabled, ECIES-encrypts it to the org's eth public key; otherwise it submits the plaintext JWS. Either way the payload is carried in `payload` and the Builder stores + delivers it as a blind relay. */
2865
3202
  CallbackDelivery: {
2866
3203
  /** Format: uuid */
2867
3204
  subscriptionId: string;
2868
- /** @description The signed result payload, as raw text (no base64) — a compact JWE (ECDH-ES + A256GCM over X25519) when the org has an encryption credential, otherwise the plaintext JWS JSON. Same raw form the callback envelope's `data` carries. */
3205
+ /** @description The signed result payload, as raw text — an ECIES ciphertext (base64url) when the org's `canEncryptResult` is enabled, otherwise the plaintext JWS JSON. Same raw form the callback envelope's `data` carries. */
2869
3206
  payload: string;
2870
3207
  };
2871
3208
  /** @description Body for `POST /verifications/sessions/{sessionId}/result`. The Verification Client signs the JWS, encrypts it per callback subscription (keys fetched from the callback-keys endpoint), and submits one ciphertext per subscription. The Builder stores + delivers them; it never sees the plaintext result. */
@@ -3004,7 +3341,7 @@ export interface operations {
3004
3341
  Providers: {
3005
3342
  parameters: {
3006
3343
  query?: {
3007
- /** @description Free-text search across `title`, `description`, `domain`, `primaryDataPoint`, `dataPoints`, and the latest version's `initialUrl`. Matched case-insensitively; returns results ranked by relevance (e.g., data point matches rank higher than description matches). */
3344
+ /** @description Free-text search across `title`, `description`, `domain`, `primaryDataPoint`, `dataPoints`, and the latest version's `initialUrl`. Matched case-insensitively; returns results ranked by relevance (e.g., data point matches rank higher than description matches). An empty value is treated as no query (the handler redirects to the bare catalog). */
3008
3345
  q?: string;
3009
3346
  /** @description Filter by tag. Repeat the parameter to OR multiple tags (a provider matching any of them is returned). Combined with `q` via AND. */
3010
3347
  tag?: components["schemas"]["Tag"][];
@@ -3089,21 +3426,414 @@ export interface operations {
3089
3426
  default: components["responses"]["ProblemResponse"];
3090
3427
  };
3091
3428
  };
3092
- ProviderPreviewImage: {
3429
+ DiscoverWebsites: {
3093
3430
  parameters: {
3094
3431
  query?: {
3095
- /** @description Cache buster. The server includes the current ETag here on the canonical URL; stale values still return the current image but without long cache headers. */
3096
- v?: string;
3432
+ /** @description Free-text query matched against website domain, data points, brand title, and description. Omit for the popular-websites list. */
3433
+ q?: string;
3097
3434
  };
3098
3435
  header?: never;
3099
- path: {
3100
- providerId: components["schemas"]["ProviderID"];
3101
- };
3436
+ path?: never;
3102
3437
  cookie?: never;
3103
3438
  };
3104
3439
  requestBody?: never;
3105
3440
  responses: {
3106
- /** @description PNG bytes */
3441
+ /** @description Website suggestions. */
3442
+ 200: {
3443
+ headers: {
3444
+ [name: string]: unknown;
3445
+ };
3446
+ content: {
3447
+ "application/json": {
3448
+ items: components["schemas"]["WebsiteSuggestion"][];
3449
+ };
3450
+ "text/html": components["schemas"]["HtmlContent"];
3451
+ };
3452
+ };
3453
+ default: components["responses"]["ProblemResponse"];
3454
+ };
3455
+ };
3456
+ SitePage: {
3457
+ parameters: {
3458
+ query?: {
3459
+ /** @description Case-insensitive substring filter on data-point names. Empty = no filter, so clearing the box doesn't need a client workaround. */
3460
+ q?: string;
3461
+ /** @description Currently selected data-point names — from a deep-link (the provider page's "Use provider") or the form's own htmx round-trips. Repeat to pass several; renders the summary panel and pre-checks the boxes. */
3462
+ dataPoints?: string[];
3463
+ /** @description Resolution mode reflected in the Continue URL. */
3464
+ mode?: "list" | "combine";
3465
+ /** @description Source pins from the form: `pins[<dataPoint>]=id,id`. Maps each data-point name to a comma-joined list of preferred providerIds (empty = Auto). */
3466
+ pins?: {
3467
+ [key: string]: string;
3468
+ };
3469
+ };
3470
+ header?: never;
3471
+ path: {
3472
+ /** @description Website domain (e.g. `github.com`). Normalized server-side (scheme / `www.` / port / path stripped). */
3473
+ domain: string;
3474
+ };
3475
+ cookie?: never;
3476
+ };
3477
+ requestBody?: never;
3478
+ responses: {
3479
+ /** @description The website's provable data points. */
3480
+ 200: {
3481
+ headers: {
3482
+ [name: string]: unknown;
3483
+ };
3484
+ content: {
3485
+ "application/json": {
3486
+ /** Format: hostname */
3487
+ domain: string;
3488
+ brandName: string;
3489
+ /** Format: uri */
3490
+ iconUrl?: string;
3491
+ dataPoints: components["schemas"]["DataPointItem"][];
3492
+ };
3493
+ "text/html": components["schemas"]["HtmlContent"];
3494
+ };
3495
+ };
3496
+ 404: components["responses"]["ProblemResponse"];
3497
+ default: components["responses"]["ProblemResponse"];
3498
+ };
3499
+ };
3500
+ SitePanel: {
3501
+ parameters: {
3502
+ query?: {
3503
+ /** @description Selected data-point names. Repeat to pass several. */
3504
+ dataPoints?: string[];
3505
+ /** @description Resolution mode reflected in the Continue URL. */
3506
+ mode?: "list" | "combine";
3507
+ /** @description Source pins from the form: `pins[<dataPoint>]=id,id`. Maps each data-point name to a comma-joined list of preferred providerIds (empty = Auto). */
3508
+ pins?: {
3509
+ [key: string]: string;
3510
+ };
3511
+ /** @description The data-point filter input rides along in the form submit; accepted and ignored here (the panel doesn't filter). */
3512
+ q?: string;
3513
+ };
3514
+ header?: never;
3515
+ path: {
3516
+ /** @description Website domain (normalized server-side). */
3517
+ domain: string;
3518
+ };
3519
+ cookie?: never;
3520
+ };
3521
+ requestBody?: never;
3522
+ responses: {
3523
+ /** @description The summary-panel fragment. */
3524
+ 200: {
3525
+ headers: {
3526
+ [name: string]: unknown;
3527
+ };
3528
+ content: {
3529
+ "text/html": components["schemas"]["HtmlContent"];
3530
+ };
3531
+ };
3532
+ 404: components["responses"]["ProblemResponse"];
3533
+ default: components["responses"]["ProblemResponse"];
3534
+ };
3535
+ };
3536
+ SiteBuild: {
3537
+ parameters: {
3538
+ query: {
3539
+ /** @description Selected data-point names. Repeat to pass several. */
3540
+ dataPoints: string[];
3541
+ /** @description `combine` (default) minimizes to the fewest providers (set-cover); `ai` is a forward-compat alias that currently resolves like combine. */
3542
+ mode?: "combine" | "ai";
3543
+ /** @description Source pins: `pins[<dataPoint>]=id,id`. Maps each data-point name to a comma-joined list of preferred providerIds. Omit for Auto. */
3544
+ pins?: {
3545
+ [key: string]: string;
3546
+ };
3547
+ /** @description Data-point names the consumer opts to SUPPLY themselves (as verification `context`) instead of having a provider prove — shrinks the provider set. Repeat to pass several. Only names that are a provider input are honoured. Subset of `dataPoints`. */
3548
+ provided?: string[];
3549
+ /** @description ProviderIds to EXCLUDE from resolution (set after a sandbox Try fails, so a different provider / merge is picked). Repeat to pass several. */
3550
+ exclude?: components["schemas"]["ProviderID"][];
3551
+ };
3552
+ header?: never;
3553
+ path: {
3554
+ /** @description Website domain (normalized server-side). */
3555
+ domain: string;
3556
+ };
3557
+ cookie?: never;
3558
+ };
3559
+ requestBody?: never;
3560
+ responses: {
3561
+ /** @description The build page. */
3562
+ 200: {
3563
+ headers: {
3564
+ [name: string]: unknown;
3565
+ };
3566
+ content: {
3567
+ "text/html": components["schemas"]["HtmlContent"];
3568
+ };
3569
+ };
3570
+ 404: components["responses"]["ProblemResponse"];
3571
+ default: components["responses"]["ProblemResponse"];
3572
+ };
3573
+ };
3574
+ SiteBuildTry: {
3575
+ parameters: {
3576
+ query: {
3577
+ /** @description Selected data-point names. Repeat to pass several. */
3578
+ dataPoints: string[];
3579
+ /** @description Resolution mode (`combine` default | `list`). */
3580
+ mode?: "combine" | "ai";
3581
+ /** @description Source pins: `pins[<dataPoint>]=id,id`. Maps each data-point name to a comma-joined list of preferred providerIds. */
3582
+ pins?: {
3583
+ [key: string]: string;
3584
+ };
3585
+ /** @description Data-point names the consumer supplies themselves (as `context`) instead of proving. Repeat to pass several. Subset of `dataPoints`. */
3586
+ provided?: string[];
3587
+ /** @description ProviderIds to exclude from resolution. Repeat to pass several. */
3588
+ exclude?: components["schemas"]["ProviderID"][];
3589
+ };
3590
+ header?: never;
3591
+ path: {
3592
+ /** @description Website domain (normalized server-side). */
3593
+ domain: string;
3594
+ };
3595
+ cookie?: never;
3596
+ };
3597
+ /** @description The verification `context` — values for the resolved providers' requiredContext inputs (the build page's input fields). The selection itself travels in the query string. */
3598
+ requestBody?: {
3599
+ content: {
3600
+ "application/x-www-form-urlencoded": components["schemas"]["SiteBuildTryBody"];
3601
+ "application/json": components["schemas"]["SiteBuildTryBody"];
3602
+ };
3603
+ };
3604
+ responses: {
3605
+ /** @description Session created. */
3606
+ 201: {
3607
+ headers: {
3608
+ [name: string]: unknown;
3609
+ };
3610
+ content: {
3611
+ "application/json": components["schemas"]["VerificationSession"];
3612
+ };
3613
+ };
3614
+ 401: components["responses"]["ProblemResponse"];
3615
+ /** @description One or more selected data points are not covered by any provider. */
3616
+ 422: {
3617
+ headers: {
3618
+ [name: string]: unknown;
3619
+ };
3620
+ content: {
3621
+ "application/problem+json": components["schemas"]["Problem"];
3622
+ };
3623
+ };
3624
+ /** @description Sandbox verification quota exceeded. */
3625
+ 429: {
3626
+ headers: {
3627
+ [name: string]: unknown;
3628
+ };
3629
+ content: {
3630
+ "application/problem+json": components["schemas"]["Problem"];
3631
+ };
3632
+ };
3633
+ default: components["responses"]["ProblemResponse"];
3634
+ };
3635
+ };
3636
+ SiteBuildRepair: {
3637
+ parameters: {
3638
+ query: {
3639
+ /** @description The failing sandbox session whose analytics seed the prompt. */
3640
+ sessionId: components["schemas"]["SessionID"];
3641
+ dataPoints?: string[];
3642
+ mode?: "combine" | "ai";
3643
+ provided?: string[];
3644
+ pins?: {
3645
+ [key: string]: string;
3646
+ };
3647
+ exclude?: components["schemas"]["ProviderID"][];
3648
+ };
3649
+ header?: never;
3650
+ path: {
3651
+ domain: string;
3652
+ };
3653
+ cookie?: never;
3654
+ };
3655
+ requestBody?: never;
3656
+ responses: {
3657
+ /** @description The repair wizard fragment. */
3658
+ 200: {
3659
+ headers: {
3660
+ [name: string]: unknown;
3661
+ };
3662
+ content: {
3663
+ "text/html": components["schemas"]["HtmlContent"];
3664
+ };
3665
+ };
3666
+ default: components["responses"]["ProblemResponse"];
3667
+ };
3668
+ };
3669
+ SiteBuildAlternative: {
3670
+ parameters: {
3671
+ query: {
3672
+ /** @description The failing sandbox session to analyze. */
3673
+ sessionId: components["schemas"]["SessionID"];
3674
+ dataPoints?: string[];
3675
+ mode?: "combine" | "ai";
3676
+ provided?: string[];
3677
+ pins?: {
3678
+ [key: string]: string;
3679
+ };
3680
+ exclude?: components["schemas"]["ProviderID"][];
3681
+ };
3682
+ header?: never;
3683
+ path: {
3684
+ domain: string;
3685
+ };
3686
+ cookie?: never;
3687
+ };
3688
+ requestBody?: never;
3689
+ responses: {
3690
+ /** @description No alternative — a fragment + `openRepair` HX-Trigger. */
3691
+ 200: {
3692
+ headers: {
3693
+ [name: string]: unknown;
3694
+ };
3695
+ content: {
3696
+ "text/html": components["schemas"]["HtmlContent"];
3697
+ };
3698
+ };
3699
+ /** @description Alternative found — `HX-Redirect` to the build page. */
3700
+ 204: {
3701
+ headers: {
3702
+ [name: string]: unknown;
3703
+ };
3704
+ content?: never;
3705
+ };
3706
+ default: components["responses"]["ProblemResponse"];
3707
+ };
3708
+ };
3709
+ DiscoverTeachAgent: {
3710
+ parameters: {
3711
+ query?: {
3712
+ /** @description Website the user wanted to verify data from. */
3713
+ domain?: string;
3714
+ /** @description Specific data point the user could not find. */
3715
+ dataPoint?: string;
3716
+ };
3717
+ header?: never;
3718
+ path?: never;
3719
+ cookie?: never;
3720
+ };
3721
+ requestBody?: never;
3722
+ responses: {
3723
+ 200: components["responses"]["HTMLResponse"];
3724
+ default: components["responses"]["ProblemResponse"];
3725
+ };
3726
+ };
3727
+ DiscoverResolve: {
3728
+ parameters: {
3729
+ query: {
3730
+ /** @description Website domain (normalized server-side). */
3731
+ domain: string;
3732
+ /** @description Selected data-point names. Repeat to pass several. */
3733
+ dataPoints: string[];
3734
+ /** @description Resolution mode. `combine` (default) uses the fewest providers; `ai` is a forward-compat alias that resolves like combine for now. */
3735
+ mode?: "combine" | "ai";
3736
+ };
3737
+ header?: never;
3738
+ path?: never;
3739
+ cookie?: never;
3740
+ };
3741
+ requestBody?: never;
3742
+ responses: {
3743
+ /** @description Resolved providers (possibly none). */
3744
+ 200: {
3745
+ headers: {
3746
+ [name: string]: unknown;
3747
+ };
3748
+ content: {
3749
+ "application/json": {
3750
+ /** @description The first resolved provider's id, if any — a convenience for the common single-provider case. */
3751
+ providerId?: components["schemas"]["ProviderID"];
3752
+ /** @description True when some selected data point has no provider (see `uncovered`) — a new provider must be authored. */
3753
+ needsCreation: boolean;
3754
+ providers: {
3755
+ providerId: components["schemas"]["ProviderID"];
3756
+ slug: string;
3757
+ /** @description The selected data points this provider covers. */
3758
+ dataPoints: string[];
3759
+ /** @description Recent verification health for this provider (last 30 days). Present only when there is enough history (a minimum number of attempts) to be meaningful; absent for new or rarely-used providers. Used to break ranking ties between providers covering the same data points. */
3760
+ reliability?: {
3761
+ /**
3762
+ * Format: float
3763
+ * @description Fraction of recent sessions that started this provider and completed its claim without failure.
3764
+ */
3765
+ recentSuccessRate: number;
3766
+ /** @description Number of recent sessions that started this provider (the sample size behind `recentSuccessRate`). */
3767
+ attempts: number;
3768
+ };
3769
+ }[];
3770
+ /** @description Selected data points no existing provider exposes. */
3771
+ uncovered: string[];
3772
+ /** @description Inputs the consumer must supply at verification time (passed as session `context`). Collect these from the user. */
3773
+ requiredContext: {
3774
+ key: string;
3775
+ required: boolean;
3776
+ description?: string;
3777
+ }[];
3778
+ /** @description Whether the resolved providers fuse into one. Informational — `POST /verifications/sessions` already accepts the whole `providers` array. */
3779
+ merge: {
3780
+ mergeable: boolean;
3781
+ /** @description True when merging removes duplicate requests to the same endpoint (saved overfetch). */
3782
+ dedupedSomeRequests?: boolean;
3783
+ };
3784
+ };
3785
+ };
3786
+ };
3787
+ default: components["responses"]["ProblemResponse"];
3788
+ };
3789
+ };
3790
+ DiscoverDataPoints: {
3791
+ parameters: {
3792
+ query: {
3793
+ /** @description Website domain (normalized server-side). */
3794
+ domain: string;
3795
+ /** @description Case-insensitive filter over data-point names. */
3796
+ q?: string;
3797
+ };
3798
+ header?: never;
3799
+ path?: never;
3800
+ cookie?: never;
3801
+ };
3802
+ requestBody?: never;
3803
+ responses: {
3804
+ /** @description Verifiable data points (possibly none). */
3805
+ 200: {
3806
+ headers: {
3807
+ [name: string]: unknown;
3808
+ };
3809
+ content: {
3810
+ "application/json": {
3811
+ dataPoints: {
3812
+ name: string;
3813
+ description?: string;
3814
+ providerCount: number;
3815
+ }[];
3816
+ };
3817
+ };
3818
+ };
3819
+ default: components["responses"]["ProblemResponse"];
3820
+ };
3821
+ };
3822
+ ProviderPreviewImage: {
3823
+ parameters: {
3824
+ query?: {
3825
+ /** @description Cache buster. The server includes the current ETag here on the canonical URL; stale values still return the current image but without long cache headers. */
3826
+ v?: string;
3827
+ };
3828
+ header?: never;
3829
+ path: {
3830
+ providerId: components["schemas"]["ProviderID"];
3831
+ };
3832
+ cookie?: never;
3833
+ };
3834
+ requestBody?: never;
3835
+ responses: {
3836
+ /** @description PNG bytes */
3107
3837
  200: {
3108
3838
  headers: {
3109
3839
  "Cache-Control"?: string;
@@ -3476,6 +4206,27 @@ export interface operations {
3476
4206
  default: components["responses"]["ProblemResponse"];
3477
4207
  };
3478
4208
  };
4209
+ DisposeVerificationSession: {
4210
+ parameters: {
4211
+ query?: never;
4212
+ header?: never;
4213
+ path: {
4214
+ sessionId: components["schemas"]["SessionID"];
4215
+ };
4216
+ cookie?: never;
4217
+ };
4218
+ requestBody?: never;
4219
+ responses: {
4220
+ /** @description Dispose requested. */
4221
+ 204: {
4222
+ headers: {
4223
+ [name: string]: unknown;
4224
+ };
4225
+ content?: never;
4226
+ };
4227
+ default: components["responses"]["ProblemResponse"];
4228
+ };
4229
+ };
3479
4230
  VerificationSessionSse: {
3480
4231
  parameters: {
3481
4232
  query?: never;
@@ -3656,31 +4407,6 @@ export interface operations {
3656
4407
  default: components["responses"]["ProblemResponse"];
3657
4408
  };
3658
4409
  };
3659
- UpdateMe: {
3660
- parameters: {
3661
- query?: never;
3662
- header?: never;
3663
- path?: never;
3664
- cookie?: never;
3665
- };
3666
- requestBody: {
3667
- content: {
3668
- "application/json": components["schemas"]["UpdateUserRequest"];
3669
- };
3670
- };
3671
- responses: {
3672
- /** @description Updated */
3673
- 200: {
3674
- headers: {
3675
- [name: string]: unknown;
3676
- };
3677
- content: {
3678
- "application/json": components["schemas"]["User"];
3679
- };
3680
- };
3681
- default: components["responses"]["ProblemResponse"];
3682
- };
3683
- };
3684
4410
  GetUser: {
3685
4411
  parameters: {
3686
4412
  query?: never;
@@ -3760,7 +4486,10 @@ export interface operations {
3760
4486
  };
3761
4487
  GetOrg: {
3762
4488
  parameters: {
3763
- query?: never;
4489
+ query?: {
4490
+ /** @description Which section to show (server-rendered tab); unknown values fall back to the first. */
4491
+ tab?: "connect" | "providers" | "members" | "themes" | "sessions" | "billing";
4492
+ };
3764
4493
  header?: never;
3765
4494
  path: {
3766
4495
  orgId: components["schemas"]["OrgID"];
@@ -3833,6 +4562,32 @@ export interface operations {
3833
4562
  default: components["responses"]["ProblemResponse"];
3834
4563
  };
3835
4564
  };
4565
+ SearchOrgMembers: {
4566
+ parameters: {
4567
+ query?: {
4568
+ /** @description Case-insensitive email substring to filter by. */
4569
+ q?: string;
4570
+ };
4571
+ header?: never;
4572
+ path: {
4573
+ orgId: components["schemas"]["OrgID"];
4574
+ };
4575
+ cookie?: never;
4576
+ };
4577
+ requestBody?: never;
4578
+ responses: {
4579
+ /** @description The members-list fragment. */
4580
+ 200: {
4581
+ headers: {
4582
+ [name: string]: unknown;
4583
+ };
4584
+ content: {
4585
+ "text/html": components["schemas"]["HtmlContent"];
4586
+ };
4587
+ };
4588
+ default: components["responses"]["ProblemResponse"];
4589
+ };
4590
+ };
3836
4591
  AddOrgMember: {
3837
4592
  parameters: {
3838
4593
  query?: never;
@@ -4106,7 +4861,7 @@ export interface operations {
4106
4861
  default: components["responses"]["ProblemResponse"];
4107
4862
  };
4108
4863
  };
4109
- GetOrgCredential: {
4864
+ GetOrgKeypair: {
4110
4865
  parameters: {
4111
4866
  query?: never;
4112
4867
  header?: never;
@@ -4123,7 +4878,7 @@ export interface operations {
4123
4878
  [name: string]: unknown;
4124
4879
  };
4125
4880
  content: {
4126
- "application/json": components["schemas"]["OrgCredential"];
4881
+ "application/json": components["schemas"]["OrgKeypair"];
4127
4882
  };
4128
4883
  };
4129
4884
  403: components["responses"]["ForbiddenResponse"];
@@ -4131,7 +4886,7 @@ export interface operations {
4131
4886
  default: components["responses"]["ProblemResponse"];
4132
4887
  };
4133
4888
  };
4134
- SetOrgCredential: {
4889
+ SetOrgKeypair: {
4135
4890
  parameters: {
4136
4891
  query?: never;
4137
4892
  header?: never;
@@ -4142,7 +4897,7 @@ export interface operations {
4142
4897
  };
4143
4898
  requestBody: {
4144
4899
  content: {
4145
- "application/json": components["schemas"]["OrgCredentialRequest"];
4900
+ "application/json": components["schemas"]["OrgKeypairRequest"];
4146
4901
  };
4147
4902
  };
4148
4903
  responses: {
@@ -4152,7 +4907,7 @@ export interface operations {
4152
4907
  [name: string]: unknown;
4153
4908
  };
4154
4909
  content: {
4155
- "application/json": components["schemas"]["OrgCredential"];
4910
+ "application/json": components["schemas"]["OrgKeypair"];
4156
4911
  };
4157
4912
  };
4158
4913
  400: components["responses"]["ProblemResponse"];
@@ -4160,7 +4915,7 @@ export interface operations {
4160
4915
  default: components["responses"]["ProblemResponse"];
4161
4916
  };
4162
4917
  };
4163
- DeleteOrgCredential: {
4918
+ DeleteOrgKeypair: {
4164
4919
  parameters: {
4165
4920
  query?: never;
4166
4921
  header?: never;
@@ -4381,6 +5136,29 @@ export interface operations {
4381
5136
  default: components["responses"]["ProblemResponse"];
4382
5137
  };
4383
5138
  };
5139
+ AttachLanding: {
5140
+ parameters: {
5141
+ query?: {
5142
+ /** @description A submitted pairing code; redirects to `/attach/{code}`. */
5143
+ code?: string;
5144
+ };
5145
+ header?: never;
5146
+ path?: never;
5147
+ cookie?: never;
5148
+ };
5149
+ requestBody?: never;
5150
+ responses: {
5151
+ 200: components["responses"]["HTMLResponse"];
5152
+ /** @description Redirect to the canonical `/attach/{code}` URL. */
5153
+ 302: {
5154
+ headers: {
5155
+ [name: string]: unknown;
5156
+ };
5157
+ content?: never;
5158
+ };
5159
+ default: components["responses"]["ProblemResponse"];
5160
+ };
5161
+ };
4384
5162
  AttachPage: {
4385
5163
  parameters: {
4386
5164
  query?: never;
@@ -5238,9 +6016,18 @@ export interface operations {
5238
6016
  };
5239
6017
  content: {
5240
6018
  "application/json": {
5241
- initialUrl: string;
5242
- requests: {
5243
- [key: string]: unknown;
6019
+ /** @description One recipe per session provider, in run order. */
6020
+ recipes: {
6021
+ providerId: components["schemas"]["ProviderID"];
6022
+ resolvedVersion: string;
6023
+ initialUrl: string;
6024
+ /** @description The version's webSettings geoLocation template (`{{DYNAMIC_GEO}}` / '' / ISO code), applied to this provider's requests. */
6025
+ geoLocation?: string;
6026
+ /** @description The version's webSettings.jsUserScripts — page JavaScript the Verification Client installs to run before every page load (before navigating to initialUrl), to drive login/navigation so the target requests fire. */
6027
+ jsUserScripts?: string;
6028
+ requests: {
6029
+ [key: string]: unknown;
6030
+ }[];
5244
6031
  }[];
5245
6032
  };
5246
6033
  };
@@ -5384,7 +6171,7 @@ export interface operations {
5384
6171
  /** Format: uuid */
5385
6172
  subscriptionId: string;
5386
6173
  event: components["schemas"]["VerificationEvent"];
5387
- /** @description The result payload, as raw text (no base64): a compact JWE (RFC 7516, ECDH-ES+A256GCM over X25519) wrapping the signed result JWS when the org has an encryption credential, else the plaintext signed JWS JSON. */
6174
+ /** @description The result payload, as raw text: an ECIES ciphertext (base64url) wrapping the signed result JWS when the org's `canEncryptResult` is enabled, else the plaintext signed JWS JSON. */
5388
6175
  payload: string;
5389
6176
  deliveryStatus: components["schemas"]["CallbackDeliveryStatus"];
5390
6177
  createdAt: components["schemas"]["Timestamp"];