@certivu/sdk 1.1.0 → 2.0.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/README.md +86 -41
- package/dist/client.d.ts +8 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/index.js +65 -3
- package/dist/methods/sign.d.ts.map +1 -1
- package/dist/types/options.d.ts +62 -1
- package/dist/types/options.d.ts.map +1 -1
- package/dist/types/responses.d.ts +1 -1
- package/dist/types/responses.d.ts.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -22,15 +22,14 @@ import { CertivuClient } from '@certivu/sdk'
|
|
|
22
22
|
const certivu = new CertivuClient({
|
|
23
23
|
apiKey: 'ctv_key_abc123',
|
|
24
24
|
generatorId: 'gen_xyz',
|
|
25
|
-
privateKey: '<base64-encoded ML-DSA private key>',
|
|
26
25
|
})
|
|
27
26
|
|
|
28
|
-
// Sign AI-generated content
|
|
29
|
-
const { token } = await certivu.sign({
|
|
30
|
-
content: imageBuffer, // Buffer
|
|
27
|
+
// Sign AI-generated content — returns the watermarked image + token
|
|
28
|
+
const { token, record_id, watermarkedContent } = await certivu.sign({
|
|
29
|
+
content: imageBuffer, // Buffer or Uint8Array
|
|
31
30
|
model: 'stable-diffusion-xl',
|
|
32
31
|
})
|
|
33
|
-
//
|
|
32
|
+
// watermarkedContent is a Uint8Array — store and serve this, not the original
|
|
34
33
|
|
|
35
34
|
// Verify — token optional, extracted automatically from XMP or watermark
|
|
36
35
|
const result = await certivu.verify({ content: imageBuffer })
|
|
@@ -52,36 +51,33 @@ Get your API key and generator credentials at [dashboard.certivu.ai](https://das
|
|
|
52
51
|
|---|---|---|---|
|
|
53
52
|
| `apiKey` | `string` | Yes | API key from the dashboard (`ctv_key_...`) |
|
|
54
53
|
| `generatorId` | `string` | No | Default generator ID for sign calls |
|
|
55
|
-
| `privateKey` | `string` | No | Base64-encoded ML-DSA private key for sign calls |
|
|
56
54
|
| `baseUrl` | `string` | No | Override API base URL (default: `https://api.certivu.ai`) |
|
|
57
55
|
|
|
58
56
|
---
|
|
59
57
|
|
|
60
58
|
### `certivu.sign(input)`
|
|
61
59
|
|
|
62
|
-
Signs AI-generated content and
|
|
60
|
+
Signs AI-generated content server-side — watermarking, hashing, and ML-DSA signing all happen in the API. Returns the signed, watermarked image.
|
|
63
61
|
|
|
64
62
|
```typescript
|
|
65
|
-
const { token, record_id } = await certivu.sign({
|
|
66
|
-
content: imageBuffer, // Uint8Array |
|
|
63
|
+
const { token, record_id, watermarkedContent } = await certivu.sign({
|
|
64
|
+
content: imageBuffer, // Uint8Array | Buffer
|
|
67
65
|
model: 'stable-diffusion-xl', // model identifier
|
|
68
66
|
generatorId: 'gen_xyz', // overrides config.generatorId
|
|
69
|
-
privateKey: '...', // overrides config.privateKey
|
|
70
67
|
})
|
|
68
|
+
// watermarkedContent — Uint8Array with ctv_ token in XMP + DCT watermark embedded
|
|
71
69
|
```
|
|
72
70
|
|
|
73
|
-
Returns `{ token: string, record_id: string }`. Embed the `token` in XMP metadata or store it alongside the content.
|
|
74
|
-
|
|
75
71
|
---
|
|
76
72
|
|
|
77
73
|
### `certivu.verify(input)`
|
|
78
74
|
|
|
79
|
-
Verifies content authenticity. Token is optional —
|
|
75
|
+
Verifies content authenticity. Token is optional — extracted automatically from XMP metadata or the frequency-domain watermark.
|
|
80
76
|
|
|
81
77
|
```typescript
|
|
82
78
|
const result = await certivu.verify({
|
|
83
|
-
content: imageBuffer, // Uint8Array |
|
|
84
|
-
token: 'ctv_...', // optional
|
|
79
|
+
content: imageBuffer, // Uint8Array | Buffer
|
|
80
|
+
token: 'ctv_...', // optional
|
|
85
81
|
})
|
|
86
82
|
```
|
|
87
83
|
|
|
@@ -103,20 +99,18 @@ const result = await certivu.verify({
|
|
|
103
99
|
model: string,
|
|
104
100
|
signed_at: string,
|
|
105
101
|
} | null,
|
|
106
|
-
reason?: string,
|
|
102
|
+
reason?: string,
|
|
107
103
|
}
|
|
108
104
|
```
|
|
109
105
|
|
|
110
|
-
**Confidence levels:**
|
|
111
|
-
|
|
112
106
|
| Confidence | Meaning |
|
|
113
107
|
|---|---|
|
|
114
108
|
| `high` | Watermark + record + signature all valid |
|
|
115
|
-
| `medium` | Record + signature valid, no watermark
|
|
116
|
-
| `low` | Partial signals
|
|
117
|
-
| `none` | No provenance
|
|
109
|
+
| `medium` | Record + signature valid, no watermark |
|
|
110
|
+
| `low` | Partial signals |
|
|
111
|
+
| `none` | No provenance found — no claim either way |
|
|
118
112
|
|
|
119
|
-
> Absence of provenance does **not** imply human origin.
|
|
113
|
+
> Absence of provenance does **not** imply human origin.
|
|
120
114
|
|
|
121
115
|
---
|
|
122
116
|
|
|
@@ -127,51 +121,102 @@ Verify up to 50 items in a single request.
|
|
|
127
121
|
```typescript
|
|
128
122
|
const { results } = await certivu.verifyBatch([
|
|
129
123
|
{ content: image1, token: token1 },
|
|
130
|
-
{ content: image2 },
|
|
124
|
+
{ content: image2 },
|
|
131
125
|
])
|
|
132
|
-
|
|
133
|
-
for (const result of results) {
|
|
134
|
-
console.log(result.authentic, result.confidence)
|
|
135
|
-
}
|
|
136
126
|
```
|
|
137
127
|
|
|
138
128
|
---
|
|
139
129
|
|
|
140
130
|
### `certivu.getAuditLog(options?)`
|
|
141
131
|
|
|
142
|
-
|
|
132
|
+
```typescript
|
|
133
|
+
const { events, total } = await certivu.getAuditLog({ page: 1, limit: 50 })
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
### `certivu.getTokenStatus(token)`
|
|
139
|
+
|
|
140
|
+
Lightweight CDN-cacheable status lookup — no image upload needed.
|
|
143
141
|
|
|
144
142
|
```typescript
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
143
|
+
const status = await certivu.getTokenStatus('ctv_7f3kx9mq2...')
|
|
144
|
+
// { generator_status: 'active' | 'revoked', model, signed_at, org_id }
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
### `certivu.getAnalyticsOverview(days?)`
|
|
150
|
+
|
|
151
|
+
Verification analytics summary. Plan-gated: Free = 7-day, Starter = 30-day, Growth+ = 90-day.
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
const overview = await certivu.getAnalyticsOverview(30)
|
|
155
|
+
// { total_verifications, tamper_count, authentic_count, daily_trend, top_records, period_days }
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
### `certivu.getRecordAnalytics(recordId)`
|
|
161
|
+
|
|
162
|
+
Per-record verification drill-down. Growth+ required.
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
const record = await certivu.getRecordAnalytics('rec-uuid')
|
|
166
|
+
// { confidence_breakdown: { high, medium, low, none }, recent_events, ... }
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
### `certivu.listWebhooks()`
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
const { endpoints, webhooks_enabled } = await certivu.listWebhooks()
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
### `certivu.createWebhook(input)`
|
|
180
|
+
|
|
181
|
+
Register a new HTTPS endpoint. Growth+ required. The `secret` in the response is shown **once**.
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
const endpoint = await certivu.createWebhook({
|
|
185
|
+
url: 'https://your-app.example.com/certivu',
|
|
186
|
+
events: ['record.created', 'verify.tamper_detected', 'quota.warning'],
|
|
148
187
|
})
|
|
149
188
|
```
|
|
150
189
|
|
|
151
190
|
---
|
|
152
191
|
|
|
153
|
-
|
|
192
|
+
### `certivu.deleteWebhook(webhookId)`
|
|
154
193
|
|
|
155
|
-
|
|
194
|
+
```typescript
|
|
195
|
+
await certivu.deleteWebhook('webhook-uuid')
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## Error handling
|
|
156
201
|
|
|
157
202
|
```typescript
|
|
158
203
|
try {
|
|
159
204
|
await certivu.sign({ content, model: 'sdxl' })
|
|
160
205
|
} catch (e) {
|
|
161
206
|
if (e instanceof Error) {
|
|
162
|
-
console.error(e.message)
|
|
207
|
+
console.error(e.message)
|
|
163
208
|
}
|
|
164
209
|
}
|
|
165
210
|
```
|
|
166
211
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
| Code | Meaning |
|
|
212
|
+
| Status | Meaning |
|
|
170
213
|
|---|---|
|
|
171
|
-
| `
|
|
172
|
-
| `
|
|
173
|
-
| `
|
|
174
|
-
| `
|
|
214
|
+
| `400` | Validation error |
|
|
215
|
+
| `401` | Bad API key |
|
|
216
|
+
| `402` | Quota exhausted (free tier) |
|
|
217
|
+
| `403` | Generator doesn't belong to your org |
|
|
218
|
+
| `404` | Generator not found or revoked |
|
|
219
|
+
| `413` | Upload exceeds 20 MB limit |
|
|
175
220
|
|
|
176
221
|
---
|
|
177
222
|
|
package/dist/client.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { VerificationResult } from "@certivu/types";
|
|
2
|
-
import type { AuditOptions, AuditPage, BatchItem, BatchVerifyResponse, ClientConfig, SignInput, SignResponse, TokenStatus, VerifyInput } from "./types/options";
|
|
2
|
+
import type { AnalyticsOverview, AuditOptions, AuditPage, BatchItem, BatchVerifyResponse, ClientConfig, CreateWebhookInput, RecordAnalytics, SignInput, SignResponse, TokenStatus, VerifyInput, WebhookEndpoint, WebhookListResponse } from "./types/options";
|
|
3
3
|
export declare class CertivuClient {
|
|
4
4
|
private readonly apiKey;
|
|
5
5
|
private readonly baseUrl;
|
|
@@ -10,5 +10,12 @@ export declare class CertivuClient {
|
|
|
10
10
|
verifyBatch(items: BatchItem[]): Promise<BatchVerifyResponse>;
|
|
11
11
|
getAuditLog(options?: AuditOptions): Promise<AuditPage>;
|
|
12
12
|
getTokenStatus(token: string): Promise<TokenStatus>;
|
|
13
|
+
getAnalyticsOverview(days?: number): Promise<AnalyticsOverview>;
|
|
14
|
+
getRecordAnalytics(recordId: string): Promise<RecordAnalytics>;
|
|
15
|
+
listWebhooks(): Promise<WebhookListResponse>;
|
|
16
|
+
createWebhook(input: CreateWebhookInput): Promise<WebhookEndpoint & {
|
|
17
|
+
secret: string;
|
|
18
|
+
}>;
|
|
19
|
+
deleteWebhook(webhookId: string): Promise<void>;
|
|
13
20
|
}
|
|
14
21
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIzD,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,WAAW,EACX,WAAW,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIzD,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,SAAS,EACT,YAAY,EACZ,WAAW,EACX,WAAW,EACX,eAAe,EACf,mBAAmB,EACpB,MAAM,iBAAiB,CAAC;AAEzB,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;gBAErC,MAAM,EAAE,YAAY;IAM1B,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC;IAM7C,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIvD,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAI7D,WAAW,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC;IAIvD,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IASnD,oBAAoB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAW/D,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAW9D,YAAY,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAW5C,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAavF,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAUtD"}
|
package/dist/index.js
CHANGED
|
@@ -21,9 +21,11 @@ function toUint8Array(content) {
|
|
|
21
21
|
async function signContent(baseUrl, apiKey, input) {
|
|
22
22
|
const bytes = toUint8Array(input.content);
|
|
23
23
|
const form = new FormData;
|
|
24
|
-
form.append("image", new Blob([bytes]), "
|
|
24
|
+
form.append("image", new Blob([bytes]), "content");
|
|
25
25
|
form.append("model", input.model);
|
|
26
26
|
form.append("generator_id", input.generatorId);
|
|
27
|
+
if (input.format)
|
|
28
|
+
form.append("format", input.format);
|
|
27
29
|
const res = await fetch(`${baseUrl}/v1/sign`, {
|
|
28
30
|
method: "POST",
|
|
29
31
|
headers: { Authorization: `Bearer ${apiKey}` },
|
|
@@ -35,8 +37,15 @@ async function signContent(baseUrl, apiKey, input) {
|
|
|
35
37
|
}
|
|
36
38
|
const token = res.headers.get("X-Certivu-Token") ?? "";
|
|
37
39
|
const record_id = res.headers.get("X-Certivu-Record-Id") ?? "";
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
+
const formatHeader = res.headers.get("X-Certivu-Format");
|
|
41
|
+
const signedContent = new Uint8Array(await res.arrayBuffer());
|
|
42
|
+
return {
|
|
43
|
+
token,
|
|
44
|
+
record_id,
|
|
45
|
+
signedContent,
|
|
46
|
+
watermarkedContent: signedContent,
|
|
47
|
+
...formatHeader ? { format: formatHeader } : {}
|
|
48
|
+
};
|
|
40
49
|
}
|
|
41
50
|
|
|
42
51
|
// src/methods/verify.ts
|
|
@@ -124,6 +133,59 @@ class CertivuClient {
|
|
|
124
133
|
}
|
|
125
134
|
return res.json();
|
|
126
135
|
}
|
|
136
|
+
async getAnalyticsOverview(days) {
|
|
137
|
+
const url = new URL(`${this.baseUrl}/v1/analytics/overview`);
|
|
138
|
+
if (days !== undefined)
|
|
139
|
+
url.searchParams.set("days", String(days));
|
|
140
|
+
const res = await fetch(url.toString(), { headers: { Authorization: `Bearer ${this.apiKey}` } });
|
|
141
|
+
if (!res.ok) {
|
|
142
|
+
const err = await res.json().catch(() => ({}));
|
|
143
|
+
throw new Error(err.error ?? `HTTP ${res.status}`);
|
|
144
|
+
}
|
|
145
|
+
return res.json();
|
|
146
|
+
}
|
|
147
|
+
async getRecordAnalytics(recordId) {
|
|
148
|
+
const res = await fetch(`${this.baseUrl}/v1/analytics/records/${encodeURIComponent(recordId)}`, {
|
|
149
|
+
headers: { Authorization: `Bearer ${this.apiKey}` }
|
|
150
|
+
});
|
|
151
|
+
if (!res.ok) {
|
|
152
|
+
const err = await res.json().catch(() => ({}));
|
|
153
|
+
throw new Error(err.error ?? `HTTP ${res.status}`);
|
|
154
|
+
}
|
|
155
|
+
return res.json();
|
|
156
|
+
}
|
|
157
|
+
async listWebhooks() {
|
|
158
|
+
const res = await fetch(`${this.baseUrl}/v1/webhooks`, {
|
|
159
|
+
headers: { Authorization: `Bearer ${this.apiKey}` }
|
|
160
|
+
});
|
|
161
|
+
if (!res.ok) {
|
|
162
|
+
const err = await res.json().catch(() => ({}));
|
|
163
|
+
throw new Error(err.error ?? `HTTP ${res.status}`);
|
|
164
|
+
}
|
|
165
|
+
return res.json();
|
|
166
|
+
}
|
|
167
|
+
async createWebhook(input) {
|
|
168
|
+
const res = await fetch(`${this.baseUrl}/v1/webhooks`, {
|
|
169
|
+
method: "POST",
|
|
170
|
+
headers: { "Content-Type": "application/json", Authorization: `Bearer ${this.apiKey}` },
|
|
171
|
+
body: JSON.stringify(input)
|
|
172
|
+
});
|
|
173
|
+
if (!res.ok) {
|
|
174
|
+
const err = await res.json().catch(() => ({}));
|
|
175
|
+
throw new Error(err.error ?? `HTTP ${res.status}`);
|
|
176
|
+
}
|
|
177
|
+
return res.json();
|
|
178
|
+
}
|
|
179
|
+
async deleteWebhook(webhookId) {
|
|
180
|
+
const res = await fetch(`${this.baseUrl}/v1/webhooks/${encodeURIComponent(webhookId)}`, {
|
|
181
|
+
method: "DELETE",
|
|
182
|
+
headers: { Authorization: `Bearer ${this.apiKey}` }
|
|
183
|
+
});
|
|
184
|
+
if (!res.ok) {
|
|
185
|
+
const err = await res.json().catch(() => ({}));
|
|
186
|
+
throw new Error(err.error ?? `HTTP ${res.status}`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
127
189
|
}
|
|
128
190
|
export {
|
|
129
191
|
CertivuClient
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sign.d.ts","sourceRoot":"","sources":["../../src/methods/sign.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAOhE,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,GAC1D,OAAO,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"sign.d.ts","sourceRoot":"","sources":["../../src/methods/sign.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAOhE,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,GAC1D,OAAO,CAAC,YAAY,CAAC,CAiCvB"}
|
package/dist/types/options.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export interface SignInput {
|
|
|
8
8
|
content: Uint8Array | string;
|
|
9
9
|
model: string;
|
|
10
10
|
generatorId?: string;
|
|
11
|
+
/** Content format. Auto-detected from magic bytes if omitted. */
|
|
12
|
+
format?: "image" | "audio" | "text";
|
|
11
13
|
}
|
|
12
14
|
export interface VerifyInput {
|
|
13
15
|
content: Uint8Array | string;
|
|
@@ -25,8 +27,12 @@ export interface SignResponse {
|
|
|
25
27
|
token: string;
|
|
26
28
|
record_id: string;
|
|
27
29
|
deduplicated?: boolean;
|
|
28
|
-
/**
|
|
30
|
+
/** Signed content bytes with ctv_ token embedded — store and deliver this instead of the original */
|
|
31
|
+
signedContent: Uint8Array;
|
|
32
|
+
/** @deprecated Use signedContent */
|
|
29
33
|
watermarkedContent: Uint8Array;
|
|
34
|
+
/** Detected or declared content format */
|
|
35
|
+
format?: "image" | "audio" | "text";
|
|
30
36
|
}
|
|
31
37
|
export interface BatchVerifyResponse {
|
|
32
38
|
results: VerificationResult[];
|
|
@@ -44,4 +50,59 @@ export interface TokenStatus {
|
|
|
44
50
|
signed_at: string;
|
|
45
51
|
generator_status: "active" | "revoked";
|
|
46
52
|
}
|
|
53
|
+
export interface AnalyticsOverview {
|
|
54
|
+
total_verifications: number;
|
|
55
|
+
tamper_count: number;
|
|
56
|
+
authentic_count: number;
|
|
57
|
+
top_records: Array<{
|
|
58
|
+
record_id: string;
|
|
59
|
+
model: string;
|
|
60
|
+
count: number;
|
|
61
|
+
tamper_count: number;
|
|
62
|
+
}>;
|
|
63
|
+
daily_trend: Array<{
|
|
64
|
+
date: string;
|
|
65
|
+
count: number;
|
|
66
|
+
tamper_count: number;
|
|
67
|
+
}>;
|
|
68
|
+
period_days: number;
|
|
69
|
+
plan_limit: number | null;
|
|
70
|
+
}
|
|
71
|
+
export interface RecordAnalytics {
|
|
72
|
+
record_id: string;
|
|
73
|
+
model: string;
|
|
74
|
+
total_verifications: number;
|
|
75
|
+
tamper_count: number;
|
|
76
|
+
authentic_count: number;
|
|
77
|
+
confidence_breakdown: {
|
|
78
|
+
high: number;
|
|
79
|
+
medium: number;
|
|
80
|
+
low: number;
|
|
81
|
+
none: number;
|
|
82
|
+
};
|
|
83
|
+
recent_events: Array<{
|
|
84
|
+
timestamp: string;
|
|
85
|
+
authentic: boolean;
|
|
86
|
+
tampered: boolean;
|
|
87
|
+
confidence: string;
|
|
88
|
+
token_source: string | null;
|
|
89
|
+
}>;
|
|
90
|
+
}
|
|
91
|
+
export interface WebhookEndpoint {
|
|
92
|
+
webhook_id: string;
|
|
93
|
+
url: string;
|
|
94
|
+
events: string[];
|
|
95
|
+
status: "active" | "disabled";
|
|
96
|
+
failure_count: number;
|
|
97
|
+
created_at: string;
|
|
98
|
+
}
|
|
99
|
+
export interface CreateWebhookInput {
|
|
100
|
+
url: string;
|
|
101
|
+
events: string[];
|
|
102
|
+
}
|
|
103
|
+
export interface WebhookListResponse {
|
|
104
|
+
endpoints: WebhookEndpoint[];
|
|
105
|
+
plan: string;
|
|
106
|
+
webhooks_enabled: boolean;
|
|
107
|
+
}
|
|
47
108
|
//# sourceMappingURL=options.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/types/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAErE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,UAAU,GAAG,MAAM,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/types/options.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export type { AuditPage, BatchVerifyResponse, SignResponse } from "./options";
|
|
1
|
+
export type { AnalyticsOverview, AuditPage, BatchVerifyResponse, CreateWebhookInput, RecordAnalytics, SignResponse, WebhookEndpoint, WebhookListResponse, } from "./options";
|
|
2
2
|
export type { AuditEvent, VerificationResult } from "@certivu/types";
|
|
3
3
|
//# sourceMappingURL=responses.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../src/types/responses.ts"],"names":[],"mappings":"AAAA,YAAY,
|
|
1
|
+
{"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../src/types/responses.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,iBAAiB,EACjB,SAAS,EACT,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@certivu/sdk",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Official SDK for Certivu — quantum-resistant AI content provenance",
|
|
5
5
|
"keywords": ["certivu", "ai", "provenance", "post-quantum", "ml-dsa", "watermark"],
|
|
6
6
|
"homepage": "https://certivu.ai",
|
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@biomejs/biome": "^1.9.4",
|
|
35
|
-
"@certivu/crypto": "
|
|
36
|
-
"@certivu/types": "
|
|
35
|
+
"@certivu/crypto": "workspace:*",
|
|
36
|
+
"@certivu/types": "workspace:*",
|
|
37
37
|
"@types/bun": "latest",
|
|
38
38
|
"typescript": "^5.7.3"
|
|
39
39
|
}
|