@ovra/ts-sdk 0.5.1 → 0.5.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.
Files changed (2) hide show
  1. package/README.md +73 -380
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -1,193 +1,112 @@
1
- # `@ovra/ts-sdk`
1
+ # Ovra SDK for TypeScript
2
2
 
3
- [![npm](https://img.shields.io/npm/v/@ovra/ts-sdk?label=npm&color=2bc760)](https://www.npmjs.com/package/@ovra/ts-sdk)
4
- [![downloads](https://img.shields.io/npm/dm/@ovra/ts-sdk?color=2bc760)](https://www.npmjs.com/package/@ovra/ts-sdk)
5
- [![bundle](https://img.shields.io/bundlephobia/minzip/@ovra/ts-sdk?label=size)](https://bundlephobia.com/package/@ovra/ts-sdk)
6
- [![types](https://img.shields.io/npm/types/@ovra/ts-sdk?color=3178c6)](https://www.npmjs.com/package/@ovra/ts-sdk)
3
+ [![npm](https://img.shields.io/npm/v/@ovra/ts-sdk.svg)](https://www.npmjs.com/package/@ovra/ts-sdk)
4
+ [![downloads](https://img.shields.io/npm/dm/@ovra/ts-sdk.svg)](https://www.npmjs.com/package/@ovra/ts-sdk)
5
+ [![types](https://img.shields.io/npm/types/@ovra/ts-sdk.svg)](https://www.npmjs.com/package/@ovra/ts-sdk)
7
6
 
8
- > Payment infrastructure for AI agents. Mint virtual Visa cards bound to
9
- > AP2 mandate chains, settle in one call, never see a PAN.
7
+ The Ovra SDK for TypeScript provides access to the [Ovra API](https://getovra.com)
8
+ payment infrastructure for AI agents from server-side TypeScript or JavaScript.
10
9
 
11
- ```ts
12
- import { Ovra } from "@ovra/ts-sdk";
13
-
14
- const ovra = new Ovra({ apiKey: process.env.OVRA_API_KEY! });
15
-
16
- const result = await ovra.pay({
17
- agentId: "agt_…", // an active agent in your workspace
18
- offerId: "aic_openai-1000", // catalog offer id
19
- merchant: "OpenAI",
20
- amount: 10.0, // €10.00
21
- purpose: "Top up OpenAI credits",
22
- });
23
-
24
- if (result.status === "completed") {
25
- console.log(result.orderId); // cmo_…
26
- console.log(result.order.amount); // { amount: 1000, currency: "eur" }
27
- console.log(result.order.authorization.network_auth_code); // "000123"
28
- console.log(result.order.receipt.id); // vrcpt_…
29
- }
30
- ```
31
-
32
- One call. The SDK declares the intent, runs the policy gate, debits
33
- the wallet, mints the DPAN, signs the 4-mandate AP2 chain, captures
34
- with the merchant, and returns the order envelope.
35
-
36
- ---
10
+ ## Documentation
37
11
 
38
- ## What you get
12
+ Full documentation lives at **[app.getovra.com/docs/quickstart](https://app.getovra.com/docs/quickstart)**.
13
+ Error reference at **[app.getovra.com/docs/errors](https://app.getovra.com/docs/errors)**.
39
14
 
40
- - **Typed end-to-end** — every request body, response envelope, and error
41
- code is generated from the live OpenAPI spec. No `any` leaking.
42
- - **One-call payments** — `ovra.pay()` for the AP2 happy path, or drop
43
- to primitives (`agents`, `intents`, `agenticCommerce.buy`) when you
44
- need control.
45
- - **Card data never reaches your code** — PAN/CVV stay inside Ovra;
46
- you get `last4` + a single-use DPAN + cryptogram per transaction.
47
- - **33 namespaces** — agents, cards, wallets, intents, transactions,
48
- agentic-commerce, refunds, webhooks, audit, billing, and 23 more.
49
- - **Idempotent by default** — every mutating call mints a UUID
50
- Idempotency-Key; safe to retry on network failure.
51
- - **Sender-agnostic** — Node 20+, Bun, Deno, Cloudflare Workers,
52
- Vercel Edge, any runtime with `fetch`.
53
-
54
- ---
55
-
56
- ## Install
15
+ ## Installation
57
16
 
58
17
  ```sh
59
- npm i @ovra/ts-sdk # or pnpm add / yarn add / bun add
18
+ npm install @ovra/ts-sdk
60
19
  ```
61
20
 
62
- Get a `sk_test_*` key from `app.getovra.com` → Settings → API keys.
63
-
64
- ---
65
-
66
- ## 60-second tour
67
-
68
- ### The one-call AP2 purchase (recommended)
21
+ ## Getting started
69
22
 
70
23
  ```ts
71
24
  import { Ovra } from "@ovra/ts-sdk";
72
25
 
73
- const ovra = new Ovra({ apiKey: process.env.OVRA_API_KEY! });
74
-
75
- // 1. Discover an offer
76
- const { data: offers } = await ovra.agenticCommerce.search({
77
- body: { vertical: "ai-credits", query: { provider: "openai", amount_usd: 10 } },
26
+ const ovra = new Ovra({
27
+ apiKey: process.env.OVRA_API_KEY!, // sk_test_… in sandbox, sk_live_… in prod
78
28
  });
79
29
 
80
- // 2. Buy it — one call covers intent + policy + wallet + DPAN + AP2 chain + capture
81
- const order = await ovra.pay({
30
+ const result = await ovra.pay({
82
31
  agentId: "agt_…",
83
- offerId: offers[0].id,
84
- merchant: offers[0].merchant.name,
85
- amount: offers[0].amountCents / 100,
32
+ offerId: "aic_openai-1000",
33
+ merchant: "OpenAI",
34
+ amount: 10.0,
35
+ purpose: "Top up OpenAI credits",
86
36
  });
87
37
 
88
- console.log(order.orderId); // cmo_…
89
- console.log(order.status); // "completed" | "pending_approval" | "failed"
90
- console.log(order.order?.receipt?.id); // vrcpt_…
91
- console.log(order.order?.mandate_chain); // { open_checkout, open_payment, closed_checkout, closed_payment }
92
- ```
93
-
94
- ### Reading + reconciling
95
-
96
- ```ts
97
- // List orders (cursor-paginated, auto-unwrapped)
98
- const orders = await ovra.agenticCommerce.listOrders();
99
- for (const o of orders.data) console.log(o.id, o.status, o.totals);
100
-
101
- // Get one with the full UCP envelope (line_items + fulfillment + adjustments)
102
- const detail = await ovra.agenticCommerce.getOrder({ path: { order_id: "cmo_…" } });
103
-
104
- // Verify the AP2 chain integrity server-side
105
- const verified = await ovra.agenticCommerce.verifyOrder({ path: { order_id: "cmo_…" } });
106
- if (!verified.data.valid) console.warn("chain tampered:", verified.data.reasons);
38
+ if (result.status === "completed") {
39
+ console.log(result.orderId); // cmo_…
40
+ console.log(result.order.amount); // { amount: 1000, currency: "eur" }
41
+ console.log(result.order.authorization.network_auth_code); // "000123"
42
+ }
107
43
  ```
108
44
 
109
- ### Refunds
45
+ `ovra.pay()` declares the intent, runs the policy gate, debits the wallet,
46
+ mints the DPAN, signs the 4-mandate AP2 chain, captures with the merchant,
47
+ and returns the order envelope in a single round-trip.
110
48
 
111
- ```ts
112
- // Partial refund — order goes COMPLETED → COMPENSATED
113
- await ovra.agenticCommerce.refundOrder({
114
- path: { order_id: "cmo_…" },
115
- body: { amount_cents: 500, reason: "customer cancellation" },
116
- });
49
+ Need the lower-level primitives (custom approval UI, manual intent, raw
50
+ generated operations)? See [app.getovra.com/docs/quickstart](https://app.getovra.com/docs/quickstart).
117
51
 
118
- // Or full refund (no body) — order goes COMPLETED → REFUNDED
119
- await ovra.agenticCommerce.refundOrder({ path: { order_id: "cmo_…" } });
120
- ```
52
+ ## Requirements
121
53
 
122
- ---
54
+ Node.js 20+, or any runtime with global `fetch` (Bun, Deno, Cloudflare
55
+ Workers, Vercel Edge).
123
56
 
124
- ## Auth scopes
57
+ ## Authentication
125
58
 
126
- The constructor takes any Ovra credential prefix. Pick the smallest scope that fits.
59
+ The constructor accepts any Ovra credential prefix. Pick the smallest
60
+ scope that fits the call site.
127
61
 
128
- | Prefix | What | When |
129
- | -------------- | --------------------- | -------------------------------------------------------------------------- |
130
- | `sk_live_…` | Full live key | Server-side prod code that mints / rotates / manages. |
131
- | `sk_test_…` | Full sandbox key | Local dev + CI. Every envelope returns `livemode: false`. |
132
- | `rk_…` | Restricted key | Read + scoped writes. Blocked from keys / webhooks / billing / policies. |
133
- | `at_…` | Agent token | Bound to one agent with a hard spend cap. The credential you ship to the agent runtime. |
62
+ | Prefix | What | Use when |
63
+ | -------------- | --------------------- | ------------------------------------------------------------------------------ |
64
+ | `sk_live_…` | Full live key | Server-side prod code that mints / rotates / manages. |
65
+ | `sk_test_…` | Full sandbox key | Local dev + CI. Every envelope returns `livemode: false`. |
66
+ | `rk_…` | Restricted key | Read + scoped writes. Blocked from keys / webhooks / billing / policies. |
67
+ | `at_…` | Agent token | Bound to one agent with a hard spend cap. Safe to ship to an agent runtime. |
134
68
 
135
69
  ```ts
136
70
  const ovra = new Ovra({
137
71
  apiKey: process.env.OVRA_API_KEY!,
138
- appInfo: { name: "AcmeCRM", version: "1.4.2" }, // X-Ovra-Client-App header
72
+ appInfo: { name: "AcmeCRM", version: "1.4.2" }, // X-Ovra-Client-App
139
73
  });
140
74
 
141
- console.log(ovra.keyScope); // "full" | "restricted" | "agent" | "unknown" (dev-time hint)
75
+ // Dev-time scope hint (not enforced server is the source of truth):
76
+ console.log(ovra.keyScope); // "full" | "restricted" | "agent" | "unknown"
142
77
  ```
143
78
 
144
- ---
145
-
146
79
  ## Errors
147
80
 
148
- Typed exceptions per error category — branch on `e.code` (machine-readable),
149
- show `e.message` to humans, link to `e.docUrl` from your own UI.
81
+ Errors are typed exceptions per category — branch on `e.code` (machine-
82
+ readable), show `e.message` to humans, link to `e.docUrl` from your own UI.
150
83
 
151
84
  ```ts
152
- import {
153
- Ovra,
154
- OvraError,
155
- OvraAuthenticationError,
156
- OvraPermissionError,
157
- OvraPaymentRequiredError,
158
- OvraConflictError,
159
- OvraNotFoundError,
160
- } from "@ovra/ts-sdk";
85
+ import { OvraError } from "@ovra/ts-sdk";
161
86
 
162
87
  try {
163
88
  await ovra.pay({ agentId, offerId, merchant, amount });
164
89
  } catch (e) {
165
90
  if (!(e instanceof OvraError)) throw e;
166
-
167
91
  switch (e.code) {
168
- case "E_INSUFFICIENT_FUNDS": return refillAndRetry(e.message);
169
- case "E_POLICY_LIMIT_EXCEEDED": return showLimits(e.escalationReason);
170
- case "E_OFFER_EXPIRED": return reSearch();
171
- case "E_MANDATE_BINDING_FAIL": return audit(e.requestId);
172
- case "E_FSM_INVALID_TRANSITION": return refreshState();
173
- default: return showError(e.message, e.docUrl);
92
+ case "E_INSUFFICIENT_FUNDS": return topUpAndRetry();
93
+ case "E_POLICY_LIMIT_EXCEEDED": return showLimits(e.message);
94
+ case "E_OFFER_EXPIRED": return refreshOffer();
95
+ case "E_FSM_INVALID_TRANSITION": return refetchOrder();
96
+ default: return reportError(e.message, e.docUrl);
174
97
  }
175
98
  }
176
99
  ```
177
100
 
178
- Every error envelope carries `code`, `type`, `message`, `param`, `docUrl`,
179
- `requestId`, and `status`. See the [error reference](https://app.getovra.com/docs/errors).
180
-
181
- ---
101
+ Every envelope carries `code`, `type`, `message`, `param`, `docUrl`,
102
+ `requestId`, `status`. Full reference: [app.getovra.com/docs/errors](https://app.getovra.com/docs/errors).
182
103
 
183
104
  ## Idempotency
184
105
 
185
- Every mutating call (POST / PATCH / DELETE) is idempotent by default — the
186
- SDK mints a UUID `Idempotency-Key` per logical operation and reuses it
187
- across retries. Replays inside the 24h dedup window return the original
188
- response with `X-Idempotent-Replayed: true`.
189
-
190
- Bring your own key when you need cross-process dedup:
106
+ Every mutating call is idempotent by default — the SDK mints a UUID
107
+ `Idempotency-Key` per logical operation and reuses it across retries.
108
+ Replays inside the 24h dedup window return the original response with
109
+ `X-Idempotent-Replayed: true`. Pass your own key for cross-process dedup:
191
110
 
192
111
  ```ts
193
112
  await ovra.intents.create({
@@ -196,223 +115,11 @@ await ovra.intents.create({
196
115
  });
197
116
  ```
198
117
 
199
- ---
200
-
201
- ## Pagination
202
-
203
- List endpoints return `{ data, has_more, next_cursor }` (auto-unwrapped from
204
- the hey-api envelope). Walk pages with `next_cursor`:
205
-
206
- ```ts
207
- let cursor: string | undefined;
208
- do {
209
- const page = await ovra.transactions.list({ query: { limit: 100, starting_after: cursor } });
210
- for (const tx of page.data) process(tx);
211
- cursor = page.has_more ? page.next_cursor : undefined;
212
- } while (cursor);
213
- ```
214
-
215
- Default `limit` is 50, max 100. Bad cursors return `400 E_VALIDATION` —
216
- no silent full-list fallback.
217
-
218
- ---
219
-
220
- ## Money
221
-
222
- Wire amounts are integer cents inside a Money object: `{ amount, currency }`.
223
-
224
- ```ts
225
- import { parseMoney, formatMoney } from "@ovra/ts-sdk";
226
-
227
- parseMoney(79.0) // { amount: 7900, currency: "eur" }
228
- parseMoney("79.00", "usd") // { amount: 7900, currency: "usd" }
229
- formatMoney({ amount: 7900, currency: "eur" }, "de-DE") // "79,00 €"
230
- ```
231
-
232
- `ovra.pay()` accepts decimals (`amount: 79.0` = €79.00) and converts at the
233
- boundary. Lower-level `agents/intents/transactions` operate on Money objects
234
- directly.
235
-
236
- ---
237
-
238
- ## Resource matrix
239
-
240
- 33 typed namespaces. Scope + plan gating shown.
241
-
242
- <details><summary><b>Money &amp; orders</b> (8 namespaces) — click to expand</summary>
243
-
244
- | Namespace | Ops | Scope | Plan |
245
- | ------------------------ | -------------------------------------------------- | :---: | :--: |
246
- | `wallets` | list / get / fund / topup | any | free |
247
- | `transactions` | list / get / memo | any | free |
248
- | `intents` | create / list / get / approve / cancel / verify | any | free |
249
- | `agenticCommerce` | listVerticals / search / getOffer / buy / listOrders / getOrder / verifyOrder / refundOrder | any | free |
250
- | `ledgerEntries` | list | full | free |
251
- | `invoices` | list / get | full | free |
252
- | `billing` | getBalance / addPaymentMethod | full | free |
253
-
254
- </details>
255
-
256
- <details><summary><b>Agents &amp; spending</b> (7 namespaces)</summary>
257
-
258
- | Namespace | Ops | Scope | Plan |
259
- | ------------------ | ----------------------------------------------------------------------- | :---: | :------: |
260
- | `agents` | create / list / get / update / attest / freeze / unfreeze | any | free |
261
- | `cards` | issue / list / get / freeze / unfreeze / rotate / close | any | free |
262
- | `policies` | list / get / create / update / delete / assign | full | free |
263
- | `delegations` | create / list / get / redeem / revoke | full | pro |
264
- | `approvalPolicies` | list / get / create / update / delete | full | business |
265
- | `costAllocations` | list / create / assign / delete | full | pro |
266
- | `spendAnomalies` | list / ack / dismiss | full | pro |
267
-
268
- </details>
269
-
270
- <details><summary><b>Compliance &amp; governance</b> (5 namespaces)</summary>
271
-
272
- | Namespace | Ops | Scope | Plan |
273
- | ------------------ | ----------------------------------------- | :---: | :------: |
274
- | `riskEvents` | list | full | business |
275
- | `disputeEvidence` | list / upload / get | any | free |
276
- | `auditEvents` | list | full | business |
277
- | `accessEvents` | list | any | free |
278
- | `metrics` | list | full | business |
279
-
280
- </details>
281
-
282
- <details><summary><b>Identity &amp; access</b> (3 namespaces)</summary>
283
-
284
- | Namespace | Ops | Scope | Plan |
285
- | -------------------- | ------------------------------------ | :---: | :--: |
286
- | `customers` | get / update / gdpr_* (dashboard) | full | free |
287
- | `apiKeys` | list / create / revoke | full | free |
288
- | `merchantCategories` | list / explain | any | free |
289
-
290
- </details>
291
-
292
- <details><summary><b>Webhooks &amp; notifications</b> (3 namespaces)</summary>
293
-
294
- | Namespace | Ops | Scope | Plan |
295
- | ------------------- | ---------------------------------------------------- | :---: | :--: |
296
- | `webhooks` | list / create / get / update / delete / rotate-secret| full | free |
297
- | `notifications` | list / unread_count / mark_read / mark_all_read | any | free |
298
- | `pushSubscriptions` | subscribe / unsubscribe / vapidPublicKey | any | free |
299
-
300
- </details>
301
-
302
- > **Want a different namespace?** Generated functions for every operation
303
- > live in `@ovra/ts-sdk/api` — bypass the bound facade and call them
304
- > directly. The bindings exist for ergonomics; nothing's hidden.
305
-
306
- ---
307
-
308
- ## Recipes
309
-
310
- <details><summary><b>Manual intent → approve → checkout</b></summary>
311
-
312
- ```ts
313
- // 1. Create an agent (policy is required; profile.purpose is required)
314
- const { data: agent } = await ovra.agents.create({
315
- body: {
316
- name: "Notion Buyer",
317
- policy: "po_…",
318
- profile: { purpose: "Monthly Notion Team Plan renewal" },
319
- },
320
- });
321
-
322
- // 2. Declare a spending intent (field is `agent`, not `agent_id`)
323
- const { data: intent } = await ovra.intents.create({
324
- body: {
325
- agent: agent.id,
326
- merchant: "Notion",
327
- amount: { amount: 7900, currency: "eur" },
328
- purpose: "Monthly Notion Team Plan renewal",
329
- },
330
- });
331
-
332
- // 3. Approve (production: passkey ceremony; sandbox: viaFixture=true)
333
- await ovra.intents.approve({ path: { id: intent.id }, body: { confirm: true } });
334
-
335
- // 4. Execute the checkout — `intent` + `target_url` both required
336
- const { data: result } = await ovra.checkout.execute({
337
- body: { intent: intent.id, target_url: "https://www.notion.so/checkout" },
338
- });
339
- console.log(result.transaction_id, result.status);
340
- ```
341
-
342
- </details>
343
-
344
- <details><summary><b>List + reconcile transactions for one agent</b></summary>
345
-
346
- ```ts
347
- let cursor: string | undefined;
348
- const all: Transaction[] = [];
349
- do {
350
- const page = await ovra.transactions.list({
351
- query: { agent: "agt_…", limit: 100, starting_after: cursor },
352
- });
353
- all.push(...page.data);
354
- cursor = page.has_more ? page.next_cursor : undefined;
355
- } while (cursor);
356
-
357
- const totalCents = all
358
- .filter(t => t.status === "completed")
359
- .reduce((sum, t) => sum + t.amount.amount, 0);
360
- ```
361
-
362
- </details>
363
-
364
- <details><summary><b>Register a webhook + handle delivery</b></summary>
365
-
366
- ```ts
367
- // One-time setup
368
- const { data: hook } = await ovra.webhooks.create({
369
- body: {
370
- url: "https://app.example.com/ovra/webhook",
371
- events: ["intent.approved", "transaction.completed", "order.refunded"],
372
- },
373
- });
374
- console.log("save this secret:", hook.signing_secret);
375
-
376
- // In your HTTP handler — verify signature with the shared secret.
377
- // Ovra uses HMAC-SHA256 over the raw body (Stripe-style):
378
- // sig = hex( hmac_sha256(secret, raw_body) )
379
- // compare in constant time against the `X-Ovra-Signature` header
380
- import { createHmac, timingSafeEqual } from "node:crypto";
381
-
382
- const expected = createHmac("sha256", process.env.OVRA_WEBHOOK_SECRET!)
383
- .update(rawBody)
384
- .digest("hex");
385
- const got = (req.headers["x-ovra-signature"] as string).replace(/^sha256=/, "");
386
- if (!timingSafeEqual(Buffer.from(expected, "hex"), Buffer.from(got, "hex"))) {
387
- return res.status(401).send("bad signature");
388
- }
389
- ```
390
-
391
- </details>
392
-
393
- <details><summary><b>Issue a delegation (sub-agent / B2B2B)</b></summary>
394
-
395
- ```ts
396
- const { data: delegation } = await ovra.delegations.create({
397
- body: {
398
- grantor_agent: "agt_…",
399
- purpose: "Marketing team — quarterly spend",
400
- spend_cap_cents: 500_00,
401
- ttl_seconds: 60 * 60 * 24 * 90, // 90 days
402
- },
403
- });
404
- // Hand `delegation.redemption_url` to the delegate; they exchange for an at_*
405
- ```
406
-
407
- </details>
408
-
409
- ---
410
-
411
118
  ## MCP server
412
119
 
413
- Prefer using Ovra straight from Claude / Cursor / any MCP-capable agent?
414
- The same surface lives in [`@ovra/mcp`](https://www.npmjs.com/package/@ovra/mcp)
415
- (10 tools). Add to `.mcp.json`:
120
+ Want to call Ovra from Claude / Cursor / any MCP client? The same surface
121
+ ships as [`@ovra/mcp`](https://www.npmjs.com/package/@ovra/mcp) (10 tools).
122
+ Add to `.mcp.json`:
416
123
 
417
124
  ```json
418
125
  {
@@ -426,36 +133,22 @@ The same surface lives in [`@ovra/mcp`](https://www.npmjs.com/package/@ovra/mcp)
426
133
  }
427
134
  ```
428
135
 
429
- ---
430
-
431
- ## Publishing
432
-
433
- <details><summary>How releases ship (npm + GitHub Actions)</summary>
434
-
435
- The SDK is regenerated from `apps/api/openapi.json` whenever the spec or
436
- `packages/sdk/src` changes. The publish workflow at
437
- `.github/workflows/sdk-publish.yaml` is wired but currently **blocked on
438
- GitHub Actions billing**. Until that's resolved, releases ship manually:
439
-
440
- ```sh
441
- # From the repo root
442
- pnpm run publish:sdk # builds, tests, publishes (refuses dirty tree)
443
- pnpm run publish:sdk:dry # rehearsal — no actual npm publish
444
- ```
136
+ ## Resource coverage
445
137
 
446
- Or directly: `cd packages/sdk && pnpm run publish-manual`.
138
+ 33 typed namespaces agents, cards, wallets, intents, transactions,
139
+ agentic-commerce (search / buy / order / refund / verify), policies,
140
+ delegations, customers, disputes, webhooks, audit, billing, and 20 more.
141
+ Generated functions for every operation are also accessible as raw exports.
447
142
 
448
- The script enforces:
449
- - Clean working tree (refuses to publish over uncommitted changes)
450
- - Local version > current npm `latest`
451
- - Valid `npm whoami` (must be authenticated)
452
- - Regen + build + tests must all pass before `npm publish`
143
+ See the [API reference](https://app.getovra.com/docs/errors) for the full
144
+ list with scope and plan requirements.
453
145
 
454
- </details>
146
+ ## Support
455
147
 
456
- ---
148
+ - Documentation: [app.getovra.com/docs/quickstart](https://app.getovra.com/docs/quickstart)
149
+ - Issues: [github.com/ovra/ovra/issues](https://github.com/ovra/ovra/issues)
150
+ - Email: support@getovra.com
457
151
 
458
152
  ## License
459
153
 
460
- UNLICENSED — internal use only until the public release lands. See the
461
- repo for the in-progress [terms](https://github.com/ovra/ovra/blob/main/LICENSE).
154
+ UNLICENSED — internal use only until the public release lands.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ovra/ts-sdk",
3
- "version": "0.5.1",
3
+ "version": "0.5.2",
4
4
  "description": "Official TypeScript SDK for the Ovra API — payment infrastructure for AI agents.",
5
5
  "author": "Ovra",
6
6
  "license": "SEE LICENSE IN LICENSE",