@isnap/sdk 2.2.0-next.212 → 2.2.0-next.213

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/CHANGELOG.md CHANGED
@@ -38,6 +38,8 @@ All notable changes to `@isnap/sdk` will be documented in this file. The format
38
38
  - **`verifyWebhook` verifies the Standard Webhooks headers only** (`webhook-id` / `webhook-timestamp` / `webhook-signature`, WHA-3658) — breaking, MAJOR (`2.0.0`). The fallback to the `X-iSnap-Signature` / `X-iSnap-Timestamp` pair is removed, because iSnap no longer sends those headers: a request that carries only them is now rejected with `WebhookSignatureError` (`Missing webhook-id header`). The key derivation no longer strips a `whs_` prefix either; only `whsec_` secrets, the only kind iSnap mints, verify. Unchanged: the `[newSecret, oldSecret]` rotation array, the `tolerance` option and its 300 s default, case-insensitive header reads, and the return value. A caller that already receives iSnap deliveries needs no code change, since every delivery since `1.4.0` carries the standard headers.
39
39
 
40
40
  ### Changed
41
+ - **An owned test line is billed like a rental line** (WHA-3701, API `2.27.0`). `lines.convertToTest()` no longer stops billing: the test line stays on the wholesale partner's end-of-month invoice as the outbound product whatever its platform, on the same billing dates (`anniversary_at` and `billing_anchor_at` are kept), and `Line.monthly_price` reads that price (27500) instead of `0`. `lines.convertFromTest()` therefore leaves the bill unchanged. `lines.convertToTest()` now refuses an inbound line (`ConflictError`, 409 `test_line_not_inbound_only`: move it to outbound with `setVariant` first) and a line with a pending cancellation (409 `line_cancellation_pending`: `uncancel` first). `lines.terminate()` of a test line leaves the instant it ended as the line's `cancel_at`, and a line transferred to a wholesale partner carries the transfer instant as `activated_at`. No SDK code changes: the generated types and the JSDoc of `convertToTest`, `convertFromTest`, `cancel` and `transferOwnership` carry the new wording.
42
+ - **`lines.assign()`, `lines.convertToTest()` and `lines.convertFromTest()` are wholesale-partner only** (WHA-3692, API `2.26.0`). A direct (non-wholesale) account is rejected with `PaymentRequiredError` (402 `checkout_required`) and nothing is reserved or converted. `assign()` refuses a direct account with or without `as_test_line`. `lines.transferOwnership()` of a line that is not billed per line (an owned test line, another pool line, a virtual shared line) to a non-wholesale recipient is a `ConflictError` (409 `line_recipient_not_wholesale`). `lines.terminate()` now ends an owned test line once no live trial rides it, which is otherwise a `ConflictError` (409 `test_line_in_use`). No SDK code changes: the existing error classes surface these refusals.
41
43
  - `src/generated/openapi.d.ts` is now generated from the **published** contract. `packages/backend/openapi.json` carries only the partner-facing `/v1/*` surface, so the internal operator routes (`/admin`, `/va`, `/farm-ops`, `/kam`, `/auth`, …) and the bridge-only `/v1/device/*` contract — plus every schema reachable only from them — are no longer emitted into the SDK types. Those routes are the dashboard, the ops back-office and the device bridge; none of them is part of the partner contract this SDK wraps, and no `ISnapClient` method referenced their types, so no documented method changes shape.
42
44
  - **`AppDownloadEntry.version` is now `string | null`** (API `1.15.0`, WHA-2538) — source-breaking for a consumer that renders `apps.manifest()`'s `version` without narrowing, which is the point. The field used to be a per-deployment configured string tied to no artifact: staging advertised `0.1.0-staging` for both platforms while the Mac ran `0.0.209` and the update channel published `0.0.x`, so the number could not be installed and the two platforms agreed only because both read one env value. It is now read from the release feed beside the artifact the download URL resolves to, and is `null` when that feed publishes nothing. Render the absence; do not substitute a number, and do not treat `null` as an error. It is also no longer the same string `byod.pair` returns as `bridge_version`.
43
45
 
package/README.md CHANGED
@@ -182,16 +182,20 @@ if (health.status !== 'ok') {
182
182
 
183
183
  ## Wholesale + test lines
184
184
 
185
- Wholesale partners mint their own billable shared lines and can park a line in a non-billable test state:
185
+ Wholesale partners mint their own billable shared lines and can set a rental line aside as a test line for their own customers' trials:
186
186
 
187
187
  ```ts
188
188
  const line = await client.lines.mintShared() // POST /v1/lines/shared — a NEW billable line every call
189
- await client.lines.convertToTest(line.id) // stop billing — park as a test line
190
- await client.lines.convertFromTest(line.id) // resume billing
189
+ await client.lines.convertToTest(rentalLineId) // set a rental line aside as a test line
190
+ await client.lines.convertFromTest(rentalLineId) // turn it back into a rental line
191
191
  ```
192
192
 
193
193
  `mintShared()` is wholesale-partner only in v1: a direct (non-wholesale) customer is rejected with `PaymentRequiredError` (402) and a scoped API key with `PermissionDeniedError` (403). Each call mints a distinct line — the SDK's auto `Idempotency-Key` only dedupes that one call's internal retries, so a caller-level retry must reuse the same `opts.idempotencyKey` to avoid minting twice.
194
194
 
195
+ A test line is **billed like a rental line**: it stays on your end-of-month invoice as the outbound product, on the same billing dates, so `convertToTest()` then `convertFromTest()` leaves your bill unchanged. Its `monthly_price` reads that price. `convertToTest()` refuses an inbound line (move it to outbound first) and a line with a pending cancellation (uncancel it first); end a test line with `client.lines.terminate(id)`.
196
+
197
+ `convertToTest()` and `convertFromTest()` are wholesale-partner only too, like `lines.assign()`: a direct account is rejected with `PaymentRequiredError` (402 `checkout_required`), and runs its trials on the global pool with `client.trial.init()`.
198
+
195
199
  ## Errors
196
200
 
197
201
  All API errors extend `APIError` and carry `status`, `code`, `message`, `traceId`, `requestId`. Subclasses match the §6 contract codes:
@@ -726,7 +726,7 @@ export interface paths {
726
726
  put?: never;
727
727
  /**
728
728
  * Atomically reserve + activate a line
729
- * @description Find an available line matching `billing_tier` (and optional `area_code`), reserve it, and activate it in a single round-trip. Useful when the partner doesn't care which specific number they get — saves the reserve→checkout→activate dance. Scoped API keys are rejected (cannot assign lines outside their allowlist). Every call takes one more line out of stock and makes it yours, so a retry MUST carry the same `Idempotency-Key` as the call it retries: the same key with the same body replays the first response instead of assigning a second line.
729
+ * @description Find an available line matching `billing_tier` (and optional `area_code`), reserve it, and activate it in a single round-trip. Useful when the partner doesn't care which specific number they get — saves the reserve→activate round-trip. **Wholesale partners only**: the line is activated with no per-line Stripe subscription and is billed on your end-of-month metered count, as with `POST /v1/lines/{id}/activate`. A direct (non-wholesale) caller with a well-formed body gets `402 checkout_required`, `as_test_line` included, and nothing is reserved: a direct customer reserves a line and pays for it through `POST /v1/billing/checkout`, whose `checkout.session.completed` webhook activates it, and runs trials on the global pool (`POST /v1/trial/init`). Scoped API keys are rejected (cannot assign lines outside their allowlist). Every call takes one more line out of stock and makes it yours, so a retry MUST carry the same `Idempotency-Key` as the call it retries: the same key with the same body replays the first response instead of assigning a second line.
730
730
  */
731
731
  post: {
732
732
  parameters: {
@@ -777,6 +777,15 @@ export interface paths {
777
777
  "application/json": components["schemas"]["ErrorEnvelope"];
778
778
  };
779
779
  };
780
+ /** @description Payment required — no billing relationship entitles this call */
781
+ 402: {
782
+ headers: {
783
+ [name: string]: unknown;
784
+ };
785
+ content: {
786
+ "application/json": components["schemas"]["ErrorEnvelope"];
787
+ };
788
+ };
780
789
  /** @description Forbidden — caller authenticated but not allowed */
781
790
  403: {
782
791
  headers: {
@@ -1207,7 +1216,7 @@ export interface paths {
1207
1216
  put?: never;
1208
1217
  /**
1209
1218
  * Transfer a line to another iSnap user
1210
- * @description Move ownership of a line to a different iSnap user. By default the paired device session stays attached so messaging continues uninterrupted; pass `preserve_device_session: false` to force the new owner to re-pair. See `/concepts/billing` for how the cutover handles the in-flight Stripe subscription.
1219
+ * @description Move ownership of a line to a different iSnap user. By default the paired device session stays attached so messaging continues uninterrupted; pass `preserve_device_session: false` to force the new owner to re-pair. See `/concepts/billing` for how the cutover handles the in-flight Stripe subscription. A line that is not billed per line (an owned test line, another pool line, a virtual shared line) can only be transferred to a wholesale partner (`409 line_recipient_not_wholesale`).
1211
1220
  */
1212
1221
  post: {
1213
1222
  parameters: {
@@ -1321,7 +1330,7 @@ export interface paths {
1321
1330
  put?: never;
1322
1331
  /**
1323
1332
  * Convert an owned rental line into a test line
1324
- * @description Flip a rental line you own into an owned test line that backs trials in your own pool (ownership → pool; test lines are free, so the deprecated monthly_price reads 0). Rejected on byod lines, lines you do not own, and lines carrying an active subscription.
1333
+ * @description Flip a two-way rental line you own into an owned test line that backs trials in your own pool (ownership → pool). **Billing does not stop**: a test line is billed on your end-of-month invoice like a rental line, as the outbound product whatever its platform, on the same billing dates (`anniversary_at`, `billing_anchor_at` and `activated_at` are kept), and the deprecated monthly_price reads that price. An inbound line is refused (409 `test_line_not_inbound_only`): move it to outbound first with `POST /v1/lines/{id}/variant`, which prorates the difference. A line with a pending cancellation is refused (409 `line_cancellation_pending`): a test line is never ended at a scheduled date, so withdraw it with `POST /v1/lines/{id}/uncancel` first, and end a test line with `POST /v1/lines/{id}/terminate`. Rejected on byod lines, lines you do not own, and lines carrying an active subscription. **Wholesale partners only**: a direct (non-wholesale) account gets `402 checkout_required` and runs its trials on the global pool (`POST /v1/trial/init`).
1325
1334
  */
1326
1335
  post: {
1327
1336
  parameters: {
@@ -1367,6 +1376,15 @@ export interface paths {
1367
1376
  "application/json": components["schemas"]["ErrorEnvelope"];
1368
1377
  };
1369
1378
  };
1379
+ /** @description Payment required — no billing relationship entitles this call */
1380
+ 402: {
1381
+ headers: {
1382
+ [name: string]: unknown;
1383
+ };
1384
+ content: {
1385
+ "application/json": components["schemas"]["ErrorEnvelope"];
1386
+ };
1387
+ };
1370
1388
  /** @description Forbidden — caller authenticated but not allowed */
1371
1389
  403: {
1372
1390
  headers: {
@@ -1431,7 +1449,7 @@ export interface paths {
1431
1449
  put?: never;
1432
1450
  /**
1433
1451
  * Revert an owned test line back to a rental line
1434
- * @description Symmetric to convert-to-test: flip an owned test line back to a rental line (ownership → rental; monthly_price reads the rental tier price again, derived — nothing is stored). Rejected while the test line still hosts live trials, since reverting would strand them.
1452
+ * @description Symmetric to convert-to-test: flip an owned test line back to a rental line (ownership → rental). Billing is unchanged: the test line was already billed as an outbound rental, on the same dates, so the monthly bill neither gains nor loses the line. Rejected while the test line still hosts live trials, since reverting would strand them. **Wholesale partners only**: the rental line it becomes carries no subscription and is billed on the end-of-month count, so a direct (non-wholesale) account gets `402 checkout_required`.
1435
1453
  */
1436
1454
  post: {
1437
1455
  parameters: {
@@ -1477,6 +1495,15 @@ export interface paths {
1477
1495
  "application/json": components["schemas"]["ErrorEnvelope"];
1478
1496
  };
1479
1497
  };
1498
+ /** @description Payment required — no billing relationship entitles this call */
1499
+ 402: {
1500
+ headers: {
1501
+ [name: string]: unknown;
1502
+ };
1503
+ content: {
1504
+ "application/json": components["schemas"]["ErrorEnvelope"];
1505
+ };
1506
+ };
1480
1507
  /** @description Forbidden — caller authenticated but not allowed */
1481
1508
  403: {
1482
1509
  headers: {
@@ -1741,7 +1768,7 @@ export interface paths {
1741
1768
  put?: never;
1742
1769
  /**
1743
1770
  * Terminate a line you own
1744
- * @description Permanently END an active line the caller owns — the self-serve counterpart to the admin terminate. Use this when your own customer cancels: `/release` only returns a *reserved* marketplace line to the shelf, while this ends a live `rental` line or a virtual `shared` line for good. The line flips to the terminal `cancelled` status and keeps its owner (who held it when it died is history, not a shelf return); queued messages fail with `carrier_terminated`, shared-fleet bindings are released (`binding.released`), device sessions are revoked, and `line.disconnected` fires with `reason: customer_initiated`. Billing stops in both shapes: a per-line Stripe subscription is cancelled immediately (not at period end), and a wholesale partner's end-of-month active-line count drops the line in the same breath. Dedicated hardware goes back to iSnap stock — the eSIM and Apple ID are recycled, never scrapped, because a customer ending a rental says nothing about whether the carrier plan is still good. **Idempotent**: terminating an already-terminated line returns 200 with the line unchanged and fires nothing a second time. Only an `active` or `suspended` line — the ones you are actually being billed for — is terminable: a merely `reserved` line is a 15-minute hold you give back with `/release`, and a `provisioning` pre-order line is cancelled through `/v1/pre-orders/{id}/cancel`. A BYOD line is terminable like any other: its device session is revoked, so the bridge or phone stops serving it, and it leaves the billable set; a direct customer's slot is freed for a new pairing. Owned test lines are refused (403) until converted back with `/convert-from-test`.
1771
+ * @description Permanently END an active line the caller owns — the self-serve counterpart to the admin terminate. Use this when your own customer cancels: `/release` only returns a *reserved* marketplace line to the shelf, while this ends a live `rental` line or a virtual `shared` line for good. The line flips to the terminal `cancelled` status and keeps its owner (who held it when it died is history, not a shelf return); queued messages fail with `carrier_terminated`, shared-fleet bindings are released (`binding.released`), device sessions are revoked, and `line.disconnected` fires with `reason: customer_initiated`. Billing stops in both shapes: a per-line Stripe subscription is cancelled immediately (not at period end), and a wholesale partner's end-of-month active-line count drops the line in the same breath. Dedicated hardware goes back to iSnap stock — the eSIM and Apple ID are recycled, never scrapped, because a customer ending a rental says nothing about whether the carrier plan is still good. **Idempotent**: terminating an already-terminated line returns 200 with the line unchanged and fires nothing a second time. Only an `active` or `suspended` line — the ones you are actually being billed for — is terminable: a merely `reserved` line is a 15-minute hold you give back with `/release`, and a `provisioning` pre-order line is cancelled through `/v1/pre-orders/{id}/cancel`. A BYOD line is terminable like any other: its device session is revoked, so the bridge or phone stops serving it, and it leaves the billable set; a direct customer's slot is freed for a new pairing. An owned test line is terminable too, once no live trial rides it (`409 test_line_in_use`), and it is ended, never converted; any other pool line is refused (403 `pool_line_not_terminable`).
1745
1772
  */
1746
1773
  post: {
1747
1774
  parameters: {
@@ -7693,15 +7720,15 @@ export interface components {
7693
7720
  status: string;
7694
7721
  /**
7695
7722
  * @deprecated
7696
- * @description Deprecated — derived from the line tier (0 for pool and owned test lines). The price a customer actually pays lives on the Stripe subscription (GET /v1/billing/subscriptions) or the pre-order amount. Removed at the next MAJOR.
7723
+ * @description Deprecated — derived from the line tier: 0 for a pool line, except an owned test line (`test_line: true`), which reads the outbound price on either platform because it is billed as the outbound product like a rental line. The price a customer actually pays lives on the Stripe subscription (GET /v1/billing/subscriptions) or the pre-order amount. Removed at the next MAJOR.
7697
7724
  */
7698
7725
  monthly_price: number;
7699
7726
  stripe_subscription_id: string | null;
7700
7727
  activated_at: string | null;
7701
7728
  expires_at: string | null;
7702
- /** @description The day you took this line, and therefore the day of the month it renews on: billed once per month at this instant, never prorated. Stamped when the line becomes yours; `null` means the line has no per-line anniversary — a direct customer's line renews on its Stripe subscription's own anchor, and a pool line is billed to nobody. Set it explicitly with POST /v1/lines/{id}/anniversary for a line you migrated from your own system, whose real start date iSnap cannot know. */
7729
+ /** @description The day you took this line, and therefore the day of the month it renews on: billed once per month at this instant, never prorated. Stamped when the line becomes yours, and kept when you convert it to a test line or back; `null` means the line has no per-line anniversary — a direct customer's line renews on its Stripe subscription's own anchor, a pool line other than a test line is billed to nobody, and a test line converted before test lines were billed carries none and is billed on its activation instant. Set it explicitly with POST /v1/lines/{id}/anniversary for a line you migrated from your own system, whose real start date iSnap cannot know. */
7703
7730
  anniversary_at: string | null;
7704
- /** @description The anniversary occurrence at which iSnap will END this line, set by POST /v1/lines/{id}/cancel and cleared by POST /v1/lines/{id}/uncancel. The line stays fully active and usable until this instant — the month is already paid for and is never prorated — and iSnap terminates it itself when the date arrives. `null` means the line is not cancelled. It survives the termination it schedules, so a `cancelled` line still says which date ended it. */
7731
+ /** @description The anniversary occurrence at which iSnap will END this line, set by POST /v1/lines/{id}/cancel and cleared by POST /v1/lines/{id}/uncancel. The line stays fully active and usable until this instant — the month is already paid for and is never prorated — and iSnap terminates it itself when the date arrives. `null` means the line is not cancelled. It survives the termination it schedules, so a `cancelled` line still says which date ended it. An owned test line cannot be cancelled at a date, so when POST /v1/lines/{id}/terminate ends one it records the instant it ended here. */
7705
7732
  cancel_at: string | null;
7706
7733
  /** @description The billing anchor you stated for this line — the date the customer who pays for it is billed on. Every line that customer holds moves on this same date, so their period and your invoice advance together. `null` means you stated nothing, NOT that the line has no billing date: it then falls back to the activation instant, which is how every line was billed before anchors existed. Set it at provisioning (`POST /v1/pre-orders`, `POST /v1/lines/{id}/activate`) or change it later with `PATCH /v1/lines/{id}` — a change takes effect at the NEXT anchor and never rewrites a period already billed. */
7707
7734
  billing_anchor_at: string | null;
@@ -7716,7 +7743,7 @@ export interface components {
7716
7743
  metadata: {
7717
7744
  [key: string]: unknown;
7718
7745
  } | null;
7719
- /** @description True when the line is an owner-provisioned test line (ownership=pool with a set owner) that backs the owner's own trial pool. Test lines are free: monthly_price is 0, like every pool line. */
7746
+ /** @description True when the line is an owner-provisioned test line (ownership=pool with a set owner) that backs the owner's own trial pool. A test line is billed like a rental line, at the outbound rental price, on the same billing dates: monthly_price reads that price. */
7720
7747
  test_line: boolean;
7721
7748
  /** @description True when the line is a virtual shared-plan line (billing_tier shared_imessage): customer-owned, no dedicated hardware, phone_number empty — sends are proxied onto the shared physical iMessage fleet. Line-scoped API keys, webhooks and per-line quota apply to it like any other line. */
7722
7749
  shared: boolean;
@@ -35,6 +35,13 @@ export declare class LinesResource extends BaseResource {
35
35
  * `POST /v1/lines/assign` — atomically find an available line matching
36
36
  * the requested billing tier (and optional area code), reserve it, and
37
37
  * activate it on the calling account in a single round-trip.
38
+ *
39
+ * **Wholesale partners only**, `as_test_line` included: the line carries no
40
+ * per-line subscription and is billed on the end-of-month count. A direct
41
+ * (non-wholesale) account is rejected with `PaymentRequiredError` (402
42
+ * `checkout_required`) and nothing is reserved; it buys a line through
43
+ * `POST /v1/billing/checkout` and runs trials with `client.trial.init()`.
44
+ * A line-scoped API key is rejected first, with `PermissionDeniedError` (403).
38
45
  */
39
46
  assign(body: AssignLineBody, opts?: RequestOptions): Promise<Line>;
40
47
  /**
@@ -96,10 +103,12 @@ export declare class LinesResource extends BaseResource {
96
103
  * A BYOD line is terminable like any other: its device session is revoked,
97
104
  * so the bridge or phone stops serving it, and it leaves the billable set.
98
105
  *
99
- * Refusals: `PermissionDeniedError` (403 `pool_line_not_terminable`) — an
100
- * owned test line must go through `convertFromTest()` first; `NotFoundError`
101
- * (404) — a line that does not exist, or one you do not own (the same code for
102
- * both, so nothing leaks).
106
+ * An owned test line is terminable too, once no live trial rides it
107
+ * (`ConflictError`, 409 `test_line_in_use`, until then).
108
+ *
109
+ * Refusals: `PermissionDeniedError` (403 `pool_line_not_terminable`) — any
110
+ * other pool line; `NotFoundError` (404) — a line that does not exist, or one
111
+ * you do not own (the same code for both, so nothing leaks).
103
112
  *
104
113
  * `body` defaults to `{}` (not `undefined`) so the request always carries
105
114
  * `Content-Type: application/json`; the route's body is optional and the
@@ -131,8 +140,9 @@ export declare class LinesResource extends BaseResource {
131
140
  * now with `terminate()`. `ConflictError` (409
132
141
  * `line_not_customer_cancellable`) — only an `active` or `suspended` line can
133
142
  * be cancelled. `PermissionDeniedError` (403 `pool_line_not_cancellable`) — an
134
- * owned test line has no per-line anniversary. Rental, shared and BYOD lines
135
- * are all cancellable. `NotFoundError` (404) — a line that does not exist,
143
+ * owned test line's end is not scheduled here: end it with `terminate()`, or
144
+ * convert it back with `convertFromTest()` and cancel the rental line. Rental,
145
+ * shared and BYOD lines are all cancellable. `NotFoundError` (404) — a line that does not exist,
136
146
  * or one you do not own (the same code for both, so nothing leaks).
137
147
  */
138
148
  cancel(id: string, opts?: RequestOptions): Promise<Line>;
@@ -165,20 +175,34 @@ export declare class LinesResource extends BaseResource {
165
175
  /**
166
176
  * `POST /v1/lines/{id}/transfer-ownership` — reassign a line to a
167
177
  * different end-user account without re-pairing the underlying device.
178
+ * A line with no subscription of its own (an owned test line, another pool
179
+ * line, a virtual shared line) can only go to a wholesale partner: any other
180
+ * recipient is a `ConflictError` (409 `line_recipient_not_wholesale`).
168
181
  */
169
182
  transferOwnership(id: string, body: TransferOwnershipBody, opts?: RequestOptions): Promise<Line>;
170
183
  /**
171
184
  * `POST /v1/lines/{id}/convert-to-test` — convert a line into a test line.
172
- * Rejected with `ConflictError` (409) for byod lines, a line you do not own,
173
- * or a line with an active subscription; a line the caller cannot see is a
174
- * masked `NotFoundError` (404).
185
+ * Billing does not stop: a test line is billed on your end-of-month invoice
186
+ * like a rental line, as the outbound product, on the same billing dates
187
+ * (`anniversary_at` and `billing_anchor_at` are kept). End a test line with
188
+ * `terminate()`.
189
+ * Wholesale partners only: a direct account is rejected with
190
+ * `PaymentRequiredError` (402 `checkout_required`). Rejected with
191
+ * `ConflictError` (409) for byod lines, a line you do not own, a line with
192
+ * an active subscription, an inbound line (`test_line_not_inbound_only`:
193
+ * move it to outbound with `setVariant` first) and a line with a pending
194
+ * cancellation (`line_cancellation_pending`: `uncancel` first); a line the
195
+ * caller cannot see is a masked `NotFoundError` (404).
175
196
  */
176
197
  convertToTest(id: string, opts?: RequestOptions): Promise<Line>;
177
198
  /**
178
199
  * `POST /v1/lines/{id}/convert-from-test` — convert a test line back to a
179
- * normal line. Rejected with `ConflictError` (409) while the test line still
180
- * hosts live trials; a line the caller cannot see is a masked
181
- * `NotFoundError` (404).
200
+ * normal line. The bill does not change: the test line was already billed as
201
+ * an outbound rental on the same dates. Wholesale partners only: a direct
202
+ * account is rejected with
203
+ * `PaymentRequiredError` (402 `checkout_required`). Rejected with
204
+ * `ConflictError` (409) while the test line still hosts live trials; a line
205
+ * the caller cannot see is a masked `NotFoundError` (404).
182
206
  */
183
207
  convertFromTest(id: string, opts?: RequestOptions): Promise<Line>;
184
208
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"lines.d.ts","sourceRoot":"","sources":["../../src/resources/lines.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lines.d.ts","sourceRoot":"","sources":["../../src/resources/lines.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,13 @@ export class LinesResource extends BaseResource {
24
24
  * `POST /v1/lines/assign` — atomically find an available line matching
25
25
  * the requested billing tier (and optional area code), reserve it, and
26
26
  * activate it on the calling account in a single round-trip.
27
+ *
28
+ * **Wholesale partners only**, `as_test_line` included: the line carries no
29
+ * per-line subscription and is billed on the end-of-month count. A direct
30
+ * (non-wholesale) account is rejected with `PaymentRequiredError` (402
31
+ * `checkout_required`) and nothing is reserved; it buys a line through
32
+ * `POST /v1/billing/checkout` and runs trials with `client.trial.init()`.
33
+ * A line-scoped API key is rejected first, with `PermissionDeniedError` (403).
27
34
  */
28
35
  assign(body, opts) {
29
36
  return this.client.request('POST', '/v1/lines/assign', body, opts);
@@ -95,10 +102,12 @@ export class LinesResource extends BaseResource {
95
102
  * A BYOD line is terminable like any other: its device session is revoked,
96
103
  * so the bridge or phone stops serving it, and it leaves the billable set.
97
104
  *
98
- * Refusals: `PermissionDeniedError` (403 `pool_line_not_terminable`) — an
99
- * owned test line must go through `convertFromTest()` first; `NotFoundError`
100
- * (404) — a line that does not exist, or one you do not own (the same code for
101
- * both, so nothing leaks).
105
+ * An owned test line is terminable too, once no live trial rides it
106
+ * (`ConflictError`, 409 `test_line_in_use`, until then).
107
+ *
108
+ * Refusals: `PermissionDeniedError` (403 `pool_line_not_terminable`) — any
109
+ * other pool line; `NotFoundError` (404) — a line that does not exist, or one
110
+ * you do not own (the same code for both, so nothing leaks).
102
111
  *
103
112
  * `body` defaults to `{}` (not `undefined`) so the request always carries
104
113
  * `Content-Type: application/json`; the route's body is optional and the
@@ -132,8 +141,9 @@ export class LinesResource extends BaseResource {
132
141
  * now with `terminate()`. `ConflictError` (409
133
142
  * `line_not_customer_cancellable`) — only an `active` or `suspended` line can
134
143
  * be cancelled. `PermissionDeniedError` (403 `pool_line_not_cancellable`) — an
135
- * owned test line has no per-line anniversary. Rental, shared and BYOD lines
136
- * are all cancellable. `NotFoundError` (404) — a line that does not exist,
144
+ * owned test line's end is not scheduled here: end it with `terminate()`, or
145
+ * convert it back with `convertFromTest()` and cancel the rental line. Rental,
146
+ * shared and BYOD lines are all cancellable. `NotFoundError` (404) — a line that does not exist,
137
147
  * or one you do not own (the same code for both, so nothing leaks).
138
148
  */
139
149
  cancel(id, opts) {
@@ -172,24 +182,38 @@ export class LinesResource extends BaseResource {
172
182
  /**
173
183
  * `POST /v1/lines/{id}/transfer-ownership` — reassign a line to a
174
184
  * different end-user account without re-pairing the underlying device.
185
+ * A line with no subscription of its own (an owned test line, another pool
186
+ * line, a virtual shared line) can only go to a wholesale partner: any other
187
+ * recipient is a `ConflictError` (409 `line_recipient_not_wholesale`).
175
188
  */
176
189
  transferOwnership(id, body, opts) {
177
190
  return this.client.request('POST', `/v1/lines/${encodeURIComponent(id)}/transfer-ownership`, body, opts);
178
191
  }
179
192
  /**
180
193
  * `POST /v1/lines/{id}/convert-to-test` — convert a line into a test line.
181
- * Rejected with `ConflictError` (409) for byod lines, a line you do not own,
182
- * or a line with an active subscription; a line the caller cannot see is a
183
- * masked `NotFoundError` (404).
194
+ * Billing does not stop: a test line is billed on your end-of-month invoice
195
+ * like a rental line, as the outbound product, on the same billing dates
196
+ * (`anniversary_at` and `billing_anchor_at` are kept). End a test line with
197
+ * `terminate()`.
198
+ * Wholesale partners only: a direct account is rejected with
199
+ * `PaymentRequiredError` (402 `checkout_required`). Rejected with
200
+ * `ConflictError` (409) for byod lines, a line you do not own, a line with
201
+ * an active subscription, an inbound line (`test_line_not_inbound_only`:
202
+ * move it to outbound with `setVariant` first) and a line with a pending
203
+ * cancellation (`line_cancellation_pending`: `uncancel` first); a line the
204
+ * caller cannot see is a masked `NotFoundError` (404).
184
205
  */
185
206
  convertToTest(id, opts) {
186
207
  return this.client.request('POST', `/v1/lines/${encodeURIComponent(id)}/convert-to-test`, undefined, opts);
187
208
  }
188
209
  /**
189
210
  * `POST /v1/lines/{id}/convert-from-test` — convert a test line back to a
190
- * normal line. Rejected with `ConflictError` (409) while the test line still
191
- * hosts live trials; a line the caller cannot see is a masked
192
- * `NotFoundError` (404).
211
+ * normal line. The bill does not change: the test line was already billed as
212
+ * an outbound rental on the same dates. Wholesale partners only: a direct
213
+ * account is rejected with
214
+ * `PaymentRequiredError` (402 `checkout_required`). Rejected with
215
+ * `ConflictError` (409) while the test line still hosts live trials; a line
216
+ * the caller cannot see is a masked `NotFoundError` (404).
193
217
  */
194
218
  convertFromTest(id, opts) {
195
219
  return this.client.request('POST', `/v1/lines/${encodeURIComponent(id)}/convert-from-test`, undefined, opts);
@@ -1 +1 @@
1
- {"version":3,"file":"lines.js","sourceRoot":"","sources":["../../src/resources/lines.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lines.js","sourceRoot":"","sources":["../../src/resources/lines.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@isnap/sdk",
3
- "version": "2.2.0-next.212",
3
+ "version": "2.2.0-next.213",
4
4
  "description": "Official TypeScript SDK for the iSnap P2P telephony API",
5
5
  "license": "MIT",
6
6
  "type": "module",