@ovra/ts-sdk 0.5.1 → 0.5.3

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 +69 -380
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -1,193 +1,108 @@
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
- ---
37
-
38
- ## What you get
10
+ ## Documentation
39
11
 
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`.
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)**.
53
14
 
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
+ console.log(result.orderId); // cmo_…
107
39
  ```
108
40
 
109
- ### Refunds
41
+ `ovra.pay()` declares the intent, runs the policy gate, debits the wallet,
42
+ mints the DPAN, signs the 4-mandate AP2 chain, captures with the merchant,
43
+ and returns the order envelope in a single round-trip.
110
44
 
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
- });
45
+ Need the lower-level primitives (custom approval UI, manual intent, raw
46
+ generated operations)? See [app.getovra.com/docs/quickstart](https://app.getovra.com/docs/quickstart).
117
47
 
118
- // Or full refund (no body) — order goes COMPLETED → REFUNDED
119
- await ovra.agenticCommerce.refundOrder({ path: { order_id: "cmo_…" } });
120
- ```
48
+ ## Requirements
121
49
 
122
- ---
50
+ Node.js 20+, or any runtime with global `fetch` (Bun, Deno, Cloudflare
51
+ Workers, Vercel Edge).
123
52
 
124
- ## Auth scopes
53
+ ## Authentication
125
54
 
126
- The constructor takes any Ovra credential prefix. Pick the smallest scope that fits.
55
+ The constructor accepts any Ovra credential prefix. Pick the smallest
56
+ scope that fits the call site.
127
57
 
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. |
58
+ | Prefix | What | Use when |
59
+ | -------------- | --------------------- | ------------------------------------------------------------------------------ |
60
+ | `sk_live_…` | Full live key | Server-side prod code that mints / rotates / manages. |
61
+ | `sk_test_…` | Full sandbox key | Local dev + CI. Every envelope returns `livemode: false`. |
62
+ | `rk_…` | Restricted key | Read + scoped writes. Blocked from keys / webhooks / billing / policies. |
63
+ | `at_…` | Agent token | Bound to one agent with a hard spend cap. Safe to ship to an agent runtime. |
134
64
 
135
65
  ```ts
136
66
  const ovra = new Ovra({
137
67
  apiKey: process.env.OVRA_API_KEY!,
138
- appInfo: { name: "AcmeCRM", version: "1.4.2" }, // X-Ovra-Client-App header
68
+ appInfo: { name: "AcmeCRM", version: "1.4.2" }, // X-Ovra-Client-App
139
69
  });
140
70
 
141
- console.log(ovra.keyScope); // "full" | "restricted" | "agent" | "unknown" (dev-time hint)
71
+ // Dev-time scope hint (not enforced server is the source of truth):
72
+ console.log(ovra.keyScope); // "full" | "restricted" | "agent" | "unknown"
142
73
  ```
143
74
 
144
- ---
145
-
146
75
  ## Errors
147
76
 
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.
77
+ Errors are typed exceptions per category — branch on `e.code` (machine-
78
+ readable), show `e.message` to humans, link to `e.docUrl` from your own UI.
150
79
 
151
80
  ```ts
152
- import {
153
- Ovra,
154
- OvraError,
155
- OvraAuthenticationError,
156
- OvraPermissionError,
157
- OvraPaymentRequiredError,
158
- OvraConflictError,
159
- OvraNotFoundError,
160
- } from "@ovra/ts-sdk";
81
+ import { OvraError } from "@ovra/ts-sdk";
161
82
 
162
83
  try {
163
84
  await ovra.pay({ agentId, offerId, merchant, amount });
164
85
  } catch (e) {
165
86
  if (!(e instanceof OvraError)) throw e;
166
-
167
87
  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);
88
+ case "E_INSUFFICIENT_FUNDS": return topUpAndRetry();
89
+ case "E_POLICY_LIMIT_EXCEEDED": return showLimits(e.message);
90
+ case "E_OFFER_EXPIRED": return refreshOffer();
91
+ case "E_FSM_INVALID_TRANSITION": return refetchOrder();
92
+ default: return reportError(e.message, e.docUrl);
174
93
  }
175
94
  }
176
95
  ```
177
96
 
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
- ---
97
+ Every envelope carries `code`, `type`, `message`, `param`, `docUrl`,
98
+ `requestId`, `status`. Full reference: [app.getovra.com/docs/errors](https://app.getovra.com/docs/errors).
182
99
 
183
100
  ## Idempotency
184
101
 
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:
102
+ Every mutating call is idempotent by default — the SDK mints a UUID
103
+ `Idempotency-Key` per logical operation and reuses it across retries.
104
+ Replays inside the 24h dedup window return the original response with
105
+ `X-Idempotent-Replayed: true`. Pass your own key for cross-process dedup:
191
106
 
192
107
  ```ts
193
108
  await ovra.intents.create({
@@ -196,223 +111,11 @@ await ovra.intents.create({
196
111
  });
197
112
  ```
198
113
 
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
114
  ## MCP server
412
115
 
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`:
116
+ Want to call Ovra from Claude / Cursor / any MCP client? The same surface
117
+ ships as [`@ovra/mcp`](https://www.npmjs.com/package/@ovra/mcp) (10 tools).
118
+ Add to `.mcp.json`:
416
119
 
417
120
  ```json
418
121
  {
@@ -426,36 +129,22 @@ The same surface lives in [`@ovra/mcp`](https://www.npmjs.com/package/@ovra/mcp)
426
129
  }
427
130
  ```
428
131
 
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
- ```
132
+ ## Resource coverage
445
133
 
446
- Or directly: `cd packages/sdk && pnpm run publish-manual`.
134
+ 33 typed namespaces agents, cards, wallets, intents, transactions,
135
+ agentic-commerce (search / buy / order / refund / verify), policies,
136
+ delegations, customers, disputes, webhooks, audit, billing, and 20 more.
137
+ Generated functions for every operation are also accessible as raw exports.
447
138
 
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`
139
+ See the [API reference](https://app.getovra.com/docs/errors) for the full
140
+ list with scope and plan requirements.
453
141
 
454
- </details>
142
+ ## Support
455
143
 
456
- ---
144
+ - Documentation: [app.getovra.com/docs/quickstart](https://app.getovra.com/docs/quickstart)
145
+ - Issues: [github.com/ovra/ovra/issues](https://github.com/ovra/ovra/issues)
146
+ - Email: support@getovra.com
457
147
 
458
148
  ## License
459
149
 
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).
150
+ 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.3",
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",