@garuhq/node 0.3.0 → 0.5.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/CHANGELOG.md +35 -0
- package/dist/index.cjs +178 -1
- package/dist/index.d.cts +251 -2
- package/dist/index.d.ts +251 -2
- package/dist/index.js +178 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,41 @@
|
|
|
3
3
|
All notable changes to `@garuhq/node` are documented in this file. Format:
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Versioning: [SemVer](https://semver.org/).
|
|
5
5
|
|
|
6
|
+
## [0.5.0] — 2026-05-01
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
|
|
10
|
+
- `scheduledCharges` resource on the `Garu` client. Schedule a charge to
|
|
11
|
+
bill a customer on a future date; Garu drives the customer reminder
|
|
12
|
+
on the due date and dunning to the seller team after.
|
|
13
|
+
- `scheduledCharges.create({ customerId, amount, type, dueDate, methods, ... })`
|
|
14
|
+
— `POST /api/scheduled-charges`. PIX and Boleto are supported now;
|
|
15
|
+
`type` accepts only `one_time` in this version.
|
|
16
|
+
- `scheduledCharges.list({ status?, customerId?, type?, dueFrom?, dueTo?, search?, ... })`
|
|
17
|
+
— `GET /api/scheduled-charges`. `status` accepts a single value or
|
|
18
|
+
an array; arrays are sent as repeated query params.
|
|
19
|
+
- `scheduledCharges.get(id)` — `GET /api/scheduled-charges/{id}`.
|
|
20
|
+
Returns a bundle: `{ charge, events, transactions }`.
|
|
21
|
+
- `scheduledCharges.postpone(id, { newDueDate, reason? })` — allowed
|
|
22
|
+
from `scheduled` / `due_today` / `overdue` / `paused`. Clears any
|
|
23
|
+
pending dunning so the new dueDate triggers a fresh reminder.
|
|
24
|
+
- `scheduledCharges.pause(id, { reason? })` — allowed from
|
|
25
|
+
`scheduled` / `due_today` / `overdue`.
|
|
26
|
+
- `scheduledCharges.resume(id)` — only valid from `paused`.
|
|
27
|
+
- `scheduledCharges.markPaid(id, { paymentDate, externalReference? })`
|
|
28
|
+
— record an off-Garu payment (transfer, cash). Allowed from
|
|
29
|
+
`due_today` / `overdue`.
|
|
30
|
+
- `customers.list({ status: 'overdue' })` — new filter that returns
|
|
31
|
+
customers with at least one overdue scheduled charge.
|
|
32
|
+
- Types exported from the package root: `CreateScheduledChargeParams`,
|
|
33
|
+
`ListScheduledChargesParams`, `MarkPaidScheduledChargeParams`,
|
|
34
|
+
`PauseScheduledChargeParams`, `PostponeScheduledChargeParams`,
|
|
35
|
+
`ScheduledChargeActor`, `ScheduledChargeDetail`,
|
|
36
|
+
`ScheduledChargeEvent`, `ScheduledChargeEventType`,
|
|
37
|
+
`ScheduledChargeLinkedTransaction`, `ScheduledChargeList`,
|
|
38
|
+
`ScheduledChargeRecord`, `ScheduledChargeStatus`,
|
|
39
|
+
`ScheduledChargeType`, `ScheduledPaymentMethod`.
|
|
40
|
+
|
|
6
41
|
## [0.3.0] — 2026-04-28
|
|
7
42
|
|
|
8
43
|
### Added
|
package/dist/index.cjs
CHANGED
|
@@ -337,7 +337,7 @@ var Customers = class {
|
|
|
337
337
|
}
|
|
338
338
|
http;
|
|
339
339
|
/**
|
|
340
|
-
*
|
|
340
|
+
* Register a customer for the current seller.
|
|
341
341
|
*
|
|
342
342
|
* @example
|
|
343
343
|
* const customer = await garu.customers.create({
|
|
@@ -367,6 +367,7 @@ var Customers = class {
|
|
|
367
367
|
if (params.page !== void 0) query.page = String(params.page);
|
|
368
368
|
if (params.limit !== void 0) query.limit = String(params.limit);
|
|
369
369
|
if (params.search) query.search = params.search;
|
|
370
|
+
if (params.status) query.status = params.status;
|
|
370
371
|
const qs = new URLSearchParams(query).toString();
|
|
371
372
|
const url = `/api/customers${qs ? `?${qs}` : ""}`;
|
|
372
373
|
return this.http.call(
|
|
@@ -402,6 +403,30 @@ var Customers = class {
|
|
|
402
403
|
}).then((r) => r)
|
|
403
404
|
);
|
|
404
405
|
}
|
|
406
|
+
/**
|
|
407
|
+
* Set or clear the per-seller billing email override.
|
|
408
|
+
*
|
|
409
|
+
* The override is sticky: it takes precedence over the per-seller last-used
|
|
410
|
+
* email and the global `customer.email` for outbound seller→customer emails,
|
|
411
|
+
* and is **never** auto-overwritten by subsequent payments or registrations.
|
|
412
|
+
*
|
|
413
|
+
* @example
|
|
414
|
+
* // Set
|
|
415
|
+
* await garu.customers.setBillingEmailOverride(42, {
|
|
416
|
+
* billingEmailOverride: 'cobrancas@empresa.com.br'
|
|
417
|
+
* });
|
|
418
|
+
*
|
|
419
|
+
* // Clear and fall back to the last-used email
|
|
420
|
+
* await garu.customers.setBillingEmailOverride(42, { billingEmailOverride: null });
|
|
421
|
+
*/
|
|
422
|
+
async setBillingEmailOverride(id, params) {
|
|
423
|
+
return this.http.call(
|
|
424
|
+
(signal) => this.http.client.PATCH(`/api/customers/${id}/billing-email-override`, {
|
|
425
|
+
body: params,
|
|
426
|
+
signal
|
|
427
|
+
}).then((r) => r)
|
|
428
|
+
);
|
|
429
|
+
}
|
|
405
430
|
/**
|
|
406
431
|
* Remove a customer from the current seller.
|
|
407
432
|
*
|
|
@@ -479,6 +504,156 @@ var Products = class {
|
|
|
479
504
|
);
|
|
480
505
|
}
|
|
481
506
|
};
|
|
507
|
+
|
|
508
|
+
// src/resources/scheduled-charges.ts
|
|
509
|
+
var ScheduledCharges = class {
|
|
510
|
+
constructor(http) {
|
|
511
|
+
this.http = http;
|
|
512
|
+
}
|
|
513
|
+
http;
|
|
514
|
+
/**
|
|
515
|
+
* Create a new scheduled charge. Auto-attaches `X-Idempotency-Key`
|
|
516
|
+
* (UUIDv4 if you don't pass `idempotencyKey`) so retries on transient
|
|
517
|
+
* network failures don't silently double-create.
|
|
518
|
+
*
|
|
519
|
+
* @example
|
|
520
|
+
* const charge = await garu.scheduledCharges.create({
|
|
521
|
+
* customerId: 42,
|
|
522
|
+
* amount: 297.50,
|
|
523
|
+
* type: 'one_time',
|
|
524
|
+
* dueDate: '2026-06-15',
|
|
525
|
+
* methods: ['pix', 'boleto'],
|
|
526
|
+
* description: 'Mensalidade Junho'
|
|
527
|
+
* });
|
|
528
|
+
*/
|
|
529
|
+
async create(params) {
|
|
530
|
+
const idempotencyKey = params.idempotencyKey ?? generateIdempotencyKey();
|
|
531
|
+
const { idempotencyKey: _omit, ...body } = params;
|
|
532
|
+
return this.http.call(
|
|
533
|
+
(signal) => this.http.client.POST("/api/scheduled-charges", {
|
|
534
|
+
body,
|
|
535
|
+
headers: { "X-Idempotency-Key": idempotencyKey },
|
|
536
|
+
signal
|
|
537
|
+
}).then((r) => r)
|
|
538
|
+
);
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* List scheduled charges for the authenticated seller, with pagination
|
|
542
|
+
* and filters. Repeat the `status` array to filter on multiple values.
|
|
543
|
+
*
|
|
544
|
+
* @example
|
|
545
|
+
* const overdue = await garu.scheduledCharges.list({ status: 'overdue', limit: 50 });
|
|
546
|
+
*
|
|
547
|
+
* @example
|
|
548
|
+
* const upcoming = await garu.scheduledCharges.list({
|
|
549
|
+
* status: ['scheduled', 'due_today'],
|
|
550
|
+
* dueFrom: '2026-06-01',
|
|
551
|
+
* dueTo: '2026-06-30'
|
|
552
|
+
* });
|
|
553
|
+
*/
|
|
554
|
+
async list(params = {}) {
|
|
555
|
+
const qs = new URLSearchParams();
|
|
556
|
+
if (params.page !== void 0) qs.set("page", String(params.page));
|
|
557
|
+
if (params.limit !== void 0) qs.set("limit", String(params.limit));
|
|
558
|
+
if (params.customerId !== void 0) qs.set("customerId", String(params.customerId));
|
|
559
|
+
if (params.type) qs.set("type", params.type);
|
|
560
|
+
if (params.dueFrom) qs.set("dueFrom", params.dueFrom);
|
|
561
|
+
if (params.dueTo) qs.set("dueTo", params.dueTo);
|
|
562
|
+
if (params.search) qs.set("search", params.search);
|
|
563
|
+
if (params.status) {
|
|
564
|
+
const statuses = Array.isArray(params.status) ? params.status : [params.status];
|
|
565
|
+
for (const s of statuses) qs.append("status", s);
|
|
566
|
+
}
|
|
567
|
+
const query = qs.toString();
|
|
568
|
+
const url = `/api/scheduled-charges${query ? `?${query}` : ""}`;
|
|
569
|
+
return this.http.call(
|
|
570
|
+
(signal) => this.http.client.GET(url, { signal }).then(
|
|
571
|
+
(r) => r
|
|
572
|
+
)
|
|
573
|
+
);
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* Fetch a single scheduled charge by ID, bundled with its event timeline
|
|
577
|
+
* and any linked Garu transactions.
|
|
578
|
+
*
|
|
579
|
+
* @example
|
|
580
|
+
* const { charge, events, transactions } = await garu.scheduledCharges.get('sch_abc123');
|
|
581
|
+
* // charge.status, events[].eventType, transactions[].status
|
|
582
|
+
*/
|
|
583
|
+
async get(id) {
|
|
584
|
+
return this.http.call(
|
|
585
|
+
(signal) => this.http.client.GET(`/api/scheduled-charges/${id}`, { signal }).then(
|
|
586
|
+
(r) => r
|
|
587
|
+
)
|
|
588
|
+
);
|
|
589
|
+
}
|
|
590
|
+
/**
|
|
591
|
+
* Postpone a scheduled charge to a new due date. Allowed from
|
|
592
|
+
* `scheduled` / `due_today` / `overdue` / `paused`. Clears any pending
|
|
593
|
+
* dunning so the new dueDate triggers a fresh customer reminder.
|
|
594
|
+
*
|
|
595
|
+
* @example
|
|
596
|
+
* await garu.scheduledCharges.postpone('sch_abc123', {
|
|
597
|
+
* newDueDate: '2026-07-01',
|
|
598
|
+
* reason: 'cliente pediu mais prazo'
|
|
599
|
+
* });
|
|
600
|
+
*/
|
|
601
|
+
async postpone(id, params) {
|
|
602
|
+
return this.http.call(
|
|
603
|
+
(signal) => this.http.client.POST(`/api/scheduled-charges/${id}/postpone`, {
|
|
604
|
+
body: params,
|
|
605
|
+
signal
|
|
606
|
+
}).then((r) => r)
|
|
607
|
+
);
|
|
608
|
+
}
|
|
609
|
+
/**
|
|
610
|
+
* Pause a scheduled charge. No reminders fire while paused. Resume
|
|
611
|
+
* returns it to `scheduled`. Allowed from
|
|
612
|
+
* `scheduled` / `due_today` / `overdue`.
|
|
613
|
+
*
|
|
614
|
+
* @example
|
|
615
|
+
* await garu.scheduledCharges.pause('sch_abc123', { reason: 'em negociação' });
|
|
616
|
+
*/
|
|
617
|
+
async pause(id, params = {}) {
|
|
618
|
+
return this.http.call(
|
|
619
|
+
(signal) => this.http.client.POST(`/api/scheduled-charges/${id}/pause`, {
|
|
620
|
+
body: params,
|
|
621
|
+
signal
|
|
622
|
+
}).then((r) => r)
|
|
623
|
+
);
|
|
624
|
+
}
|
|
625
|
+
/**
|
|
626
|
+
* Resume a paused scheduled charge. Only valid from `paused`.
|
|
627
|
+
*
|
|
628
|
+
* @example
|
|
629
|
+
* await garu.scheduledCharges.resume('sch_abc123');
|
|
630
|
+
*/
|
|
631
|
+
async resume(id) {
|
|
632
|
+
return this.http.call(
|
|
633
|
+
(signal) => this.http.client.POST(`/api/scheduled-charges/${id}/resume`, {
|
|
634
|
+
signal
|
|
635
|
+
}).then((r) => r)
|
|
636
|
+
);
|
|
637
|
+
}
|
|
638
|
+
/**
|
|
639
|
+
* Manually mark a scheduled charge as paid, e.g. when the customer paid
|
|
640
|
+
* outside Garu (bank transfer, cash). Allowed from `due_today` / `overdue`.
|
|
641
|
+
*
|
|
642
|
+
* @example
|
|
643
|
+
* await garu.scheduledCharges.markPaid('sch_abc123', {
|
|
644
|
+
* paymentDate: '2026-06-20',
|
|
645
|
+
* externalReference: 'TED 4472881'
|
|
646
|
+
* });
|
|
647
|
+
*/
|
|
648
|
+
async markPaid(id, params) {
|
|
649
|
+
return this.http.call(
|
|
650
|
+
(signal) => this.http.client.POST(`/api/scheduled-charges/${id}/mark-paid`, {
|
|
651
|
+
body: params,
|
|
652
|
+
signal
|
|
653
|
+
}).then((r) => r)
|
|
654
|
+
);
|
|
655
|
+
}
|
|
656
|
+
};
|
|
482
657
|
var webhooks = {
|
|
483
658
|
verify(params) {
|
|
484
659
|
const { signature, secret, payload } = params;
|
|
@@ -544,6 +719,7 @@ var Garu = class {
|
|
|
544
719
|
customers;
|
|
545
720
|
meta;
|
|
546
721
|
products;
|
|
722
|
+
scheduledCharges;
|
|
547
723
|
/**
|
|
548
724
|
* Webhook helpers. Available both as an instance member and as a static —
|
|
549
725
|
* `Garu.webhooks.verify(...)` works without constructing a client.
|
|
@@ -563,6 +739,7 @@ var Garu = class {
|
|
|
563
739
|
this.customers = new Customers(http);
|
|
564
740
|
this.meta = new Meta(http);
|
|
565
741
|
this.products = new Products(http);
|
|
742
|
+
this.scheduledCharges = new ScheduledCharges(http);
|
|
566
743
|
}
|
|
567
744
|
};
|
|
568
745
|
|
package/dist/index.d.cts
CHANGED
|
@@ -219,8 +219,22 @@ interface CustomerRecord {
|
|
|
219
219
|
state?: string | null;
|
|
220
220
|
createdAt: string;
|
|
221
221
|
updatedAt: string;
|
|
222
|
+
/**
|
|
223
|
+
* Resolved billing email used for outbound seller→customer emails:
|
|
224
|
+
* `billingEmailOverride ?? per-seller email ?? customer.email`.
|
|
225
|
+
*/
|
|
226
|
+
billingEmail?: string;
|
|
227
|
+
/** True when a sticky `billingEmailOverride` is set for this seller. */
|
|
228
|
+
hasBillingEmailOverride?: boolean;
|
|
222
229
|
[key: string]: unknown;
|
|
223
230
|
}
|
|
231
|
+
interface SetBillingEmailOverrideParams {
|
|
232
|
+
/**
|
|
233
|
+
* Customer-controlled billing email. Pass `null` to clear and fall back to
|
|
234
|
+
* the per-seller last-used email or the global `customer.email`.
|
|
235
|
+
*/
|
|
236
|
+
billingEmailOverride: string | null;
|
|
237
|
+
}
|
|
224
238
|
type CustomerList = PaginatedList<CustomerRecord>;
|
|
225
239
|
interface CreateCustomerParams {
|
|
226
240
|
name: string;
|
|
@@ -258,6 +272,127 @@ interface ListCustomersParams {
|
|
|
258
272
|
page?: number;
|
|
259
273
|
limit?: number;
|
|
260
274
|
search?: string;
|
|
275
|
+
/** Filter by aggregated status. `overdue` returns customers with at least one overdue scheduled charge. */
|
|
276
|
+
status?: 'overdue';
|
|
277
|
+
}
|
|
278
|
+
type ScheduledChargeStatus = 'scheduled' | 'due_today' | 'overdue' | 'paid' | 'paused' | 'canceled' | 'trial' | 'pending_tokenization' | 'recurrence_canceled';
|
|
279
|
+
type ScheduledChargeType = 'one_time' | 'recurring';
|
|
280
|
+
type ScheduledPaymentMethod = 'pix' | 'boleto';
|
|
281
|
+
type ScheduledChargeEventType = 'created' | 'postponed' | 'paused' | 'resumed' | 'recurrence_canceled' | 'manually_marked_paid' | 'paid' | 'overdue_reminder_sent' | 'd_day_reminder_sent';
|
|
282
|
+
type ScheduledChargeActor = {
|
|
283
|
+
type: 'user';
|
|
284
|
+
id: number;
|
|
285
|
+
} | {
|
|
286
|
+
type: 'api_key';
|
|
287
|
+
id: number;
|
|
288
|
+
} | {
|
|
289
|
+
type: 'system';
|
|
290
|
+
};
|
|
291
|
+
interface ScheduledChargeRecord {
|
|
292
|
+
id: string;
|
|
293
|
+
sellerId: number;
|
|
294
|
+
customerId: number;
|
|
295
|
+
productId: number | null;
|
|
296
|
+
/** Decimal BRL (e.g. `297.50`), never centavos. */
|
|
297
|
+
amount: number;
|
|
298
|
+
description: string | null;
|
|
299
|
+
type: ScheduledChargeType;
|
|
300
|
+
/** YYYY-MM-DD in São Paulo time. */
|
|
301
|
+
dueDate: string;
|
|
302
|
+
methods: ScheduledPaymentMethod[];
|
|
303
|
+
status: ScheduledChargeStatus;
|
|
304
|
+
externalReference: string | null;
|
|
305
|
+
metadata: Record<string, unknown> | null;
|
|
306
|
+
createdAt: string;
|
|
307
|
+
updatedAt: string;
|
|
308
|
+
/** Eager-loaded customer (id/name/email/document only). */
|
|
309
|
+
customer?: {
|
|
310
|
+
id: number;
|
|
311
|
+
name: string;
|
|
312
|
+
email: string;
|
|
313
|
+
document: string;
|
|
314
|
+
} | null;
|
|
315
|
+
/** Eager-loaded product (id/uuid/name only). */
|
|
316
|
+
product?: {
|
|
317
|
+
id: number;
|
|
318
|
+
uuid: string;
|
|
319
|
+
name: string;
|
|
320
|
+
} | null;
|
|
321
|
+
[key: string]: unknown;
|
|
322
|
+
}
|
|
323
|
+
interface ScheduledChargeEvent {
|
|
324
|
+
id: number;
|
|
325
|
+
scheduledChargeId: string;
|
|
326
|
+
eventType: ScheduledChargeEventType;
|
|
327
|
+
actor: ScheduledChargeActor;
|
|
328
|
+
payload: Record<string, unknown> | null;
|
|
329
|
+
createdAt: string;
|
|
330
|
+
}
|
|
331
|
+
interface ScheduledChargeLinkedTransaction {
|
|
332
|
+
id: number;
|
|
333
|
+
/** Centavos (BRL × 100), matching `garu.charges.*` value semantics. */
|
|
334
|
+
value: number;
|
|
335
|
+
paymentMethod: string;
|
|
336
|
+
status: string;
|
|
337
|
+
date: string;
|
|
338
|
+
refundedAt: string | null;
|
|
339
|
+
[key: string]: unknown;
|
|
340
|
+
}
|
|
341
|
+
interface ScheduledChargeDetail {
|
|
342
|
+
charge: ScheduledChargeRecord;
|
|
343
|
+
events: ScheduledChargeEvent[];
|
|
344
|
+
transactions: ScheduledChargeLinkedTransaction[];
|
|
345
|
+
}
|
|
346
|
+
type ScheduledChargeList = PaginatedList<ScheduledChargeRecord>;
|
|
347
|
+
interface CreateScheduledChargeParams {
|
|
348
|
+
customerId: number;
|
|
349
|
+
productId?: number;
|
|
350
|
+
/** Decimal BRL (e.g. `297.50`). */
|
|
351
|
+
amount: number;
|
|
352
|
+
description?: string;
|
|
353
|
+
/**
|
|
354
|
+
* Schedule type. Only `one_time` is accepted by the current API; the
|
|
355
|
+
* literal narrows to that until recurring schedules ship.
|
|
356
|
+
*/
|
|
357
|
+
type: 'one_time';
|
|
358
|
+
/** YYYY-MM-DD in São Paulo time. Must be today or future. */
|
|
359
|
+
dueDate: string;
|
|
360
|
+
/** PIX and Boleto are supported now; card requires tokenization (future). */
|
|
361
|
+
methods: ScheduledPaymentMethod[];
|
|
362
|
+
externalReference?: string;
|
|
363
|
+
metadata?: Record<string, unknown>;
|
|
364
|
+
/**
|
|
365
|
+
* Optional idempotency key for safe retries. The SDK auto-generates a
|
|
366
|
+
* UUIDv4 when omitted and forwards it as `X-Idempotency-Key`.
|
|
367
|
+
*/
|
|
368
|
+
idempotencyKey?: string;
|
|
369
|
+
}
|
|
370
|
+
interface ListScheduledChargesParams {
|
|
371
|
+
page?: number;
|
|
372
|
+
limit?: number;
|
|
373
|
+
customerId?: number;
|
|
374
|
+
status?: ScheduledChargeStatus | ScheduledChargeStatus[];
|
|
375
|
+
type?: ScheduledChargeType;
|
|
376
|
+
/** YYYY-MM-DD lower bound for `dueDate`. */
|
|
377
|
+
dueFrom?: string;
|
|
378
|
+
/** YYYY-MM-DD upper bound for `dueDate`. */
|
|
379
|
+
dueTo?: string;
|
|
380
|
+
/** Free-text match against customer name / email / document. */
|
|
381
|
+
search?: string;
|
|
382
|
+
}
|
|
383
|
+
interface PostponeScheduledChargeParams {
|
|
384
|
+
/** YYYY-MM-DD in São Paulo time. Must be today or future. */
|
|
385
|
+
newDueDate: string;
|
|
386
|
+
reason?: string;
|
|
387
|
+
}
|
|
388
|
+
interface PauseScheduledChargeParams {
|
|
389
|
+
reason?: string;
|
|
390
|
+
}
|
|
391
|
+
interface MarkPaidScheduledChargeParams {
|
|
392
|
+
/** YYYY-MM-DD in São Paulo time. Must be today or past. */
|
|
393
|
+
paymentDate: string;
|
|
394
|
+
/** Bank reference, internal ID, or any stable string for reconciliation. */
|
|
395
|
+
externalReference?: string;
|
|
261
396
|
}
|
|
262
397
|
interface Product {
|
|
263
398
|
id: number;
|
|
@@ -406,7 +541,7 @@ declare class Customers {
|
|
|
406
541
|
private readonly http;
|
|
407
542
|
constructor(http: HttpClient);
|
|
408
543
|
/**
|
|
409
|
-
*
|
|
544
|
+
* Register a customer for the current seller.
|
|
410
545
|
*
|
|
411
546
|
* @example
|
|
412
547
|
* const customer = await garu.customers.create({
|
|
@@ -439,6 +574,23 @@ declare class Customers {
|
|
|
439
574
|
* const updated = await garu.customers.update(42, { name: 'Maria Santos' });
|
|
440
575
|
*/
|
|
441
576
|
update(id: number, params: UpdateCustomerParams): Promise<CustomerRecord>;
|
|
577
|
+
/**
|
|
578
|
+
* Set or clear the per-seller billing email override.
|
|
579
|
+
*
|
|
580
|
+
* The override is sticky: it takes precedence over the per-seller last-used
|
|
581
|
+
* email and the global `customer.email` for outbound seller→customer emails,
|
|
582
|
+
* and is **never** auto-overwritten by subsequent payments or registrations.
|
|
583
|
+
*
|
|
584
|
+
* @example
|
|
585
|
+
* // Set
|
|
586
|
+
* await garu.customers.setBillingEmailOverride(42, {
|
|
587
|
+
* billingEmailOverride: 'cobrancas@empresa.com.br'
|
|
588
|
+
* });
|
|
589
|
+
*
|
|
590
|
+
* // Clear and fall back to the last-used email
|
|
591
|
+
* await garu.customers.setBillingEmailOverride(42, { billingEmailOverride: null });
|
|
592
|
+
*/
|
|
593
|
+
setBillingEmailOverride(id: number, params: SetBillingEmailOverrideParams): Promise<CustomerRecord>;
|
|
442
594
|
/**
|
|
443
595
|
* Remove a customer from the current seller.
|
|
444
596
|
*
|
|
@@ -495,6 +647,102 @@ declare class Products {
|
|
|
495
647
|
get(uuid: string): Promise<Product>;
|
|
496
648
|
}
|
|
497
649
|
|
|
650
|
+
/**
|
|
651
|
+
* Scheduled charges — bill a customer on a future date.
|
|
652
|
+
*
|
|
653
|
+
* The seller registers a customer (see `garu.customers.create`), then
|
|
654
|
+
* schedules one or more charges (PIX or Boleto). Garu drives the rest:
|
|
655
|
+
* pre-charge customer email on the due date, dunning to the seller team
|
|
656
|
+
* after the due date, and a state machine for postpone/pause/resume/
|
|
657
|
+
* mark-paid actions.
|
|
658
|
+
*
|
|
659
|
+
* Recurring schedules are reserved for a future API version; the current
|
|
660
|
+
* `type` field accepts only `one_time`.
|
|
661
|
+
*/
|
|
662
|
+
declare class ScheduledCharges {
|
|
663
|
+
private readonly http;
|
|
664
|
+
constructor(http: HttpClient);
|
|
665
|
+
/**
|
|
666
|
+
* Create a new scheduled charge. Auto-attaches `X-Idempotency-Key`
|
|
667
|
+
* (UUIDv4 if you don't pass `idempotencyKey`) so retries on transient
|
|
668
|
+
* network failures don't silently double-create.
|
|
669
|
+
*
|
|
670
|
+
* @example
|
|
671
|
+
* const charge = await garu.scheduledCharges.create({
|
|
672
|
+
* customerId: 42,
|
|
673
|
+
* amount: 297.50,
|
|
674
|
+
* type: 'one_time',
|
|
675
|
+
* dueDate: '2026-06-15',
|
|
676
|
+
* methods: ['pix', 'boleto'],
|
|
677
|
+
* description: 'Mensalidade Junho'
|
|
678
|
+
* });
|
|
679
|
+
*/
|
|
680
|
+
create(params: CreateScheduledChargeParams): Promise<ScheduledChargeRecord>;
|
|
681
|
+
/**
|
|
682
|
+
* List scheduled charges for the authenticated seller, with pagination
|
|
683
|
+
* and filters. Repeat the `status` array to filter on multiple values.
|
|
684
|
+
*
|
|
685
|
+
* @example
|
|
686
|
+
* const overdue = await garu.scheduledCharges.list({ status: 'overdue', limit: 50 });
|
|
687
|
+
*
|
|
688
|
+
* @example
|
|
689
|
+
* const upcoming = await garu.scheduledCharges.list({
|
|
690
|
+
* status: ['scheduled', 'due_today'],
|
|
691
|
+
* dueFrom: '2026-06-01',
|
|
692
|
+
* dueTo: '2026-06-30'
|
|
693
|
+
* });
|
|
694
|
+
*/
|
|
695
|
+
list(params?: ListScheduledChargesParams): Promise<ScheduledChargeList>;
|
|
696
|
+
/**
|
|
697
|
+
* Fetch a single scheduled charge by ID, bundled with its event timeline
|
|
698
|
+
* and any linked Garu transactions.
|
|
699
|
+
*
|
|
700
|
+
* @example
|
|
701
|
+
* const { charge, events, transactions } = await garu.scheduledCharges.get('sch_abc123');
|
|
702
|
+
* // charge.status, events[].eventType, transactions[].status
|
|
703
|
+
*/
|
|
704
|
+
get(id: string): Promise<ScheduledChargeDetail>;
|
|
705
|
+
/**
|
|
706
|
+
* Postpone a scheduled charge to a new due date. Allowed from
|
|
707
|
+
* `scheduled` / `due_today` / `overdue` / `paused`. Clears any pending
|
|
708
|
+
* dunning so the new dueDate triggers a fresh customer reminder.
|
|
709
|
+
*
|
|
710
|
+
* @example
|
|
711
|
+
* await garu.scheduledCharges.postpone('sch_abc123', {
|
|
712
|
+
* newDueDate: '2026-07-01',
|
|
713
|
+
* reason: 'cliente pediu mais prazo'
|
|
714
|
+
* });
|
|
715
|
+
*/
|
|
716
|
+
postpone(id: string, params: PostponeScheduledChargeParams): Promise<ScheduledChargeRecord>;
|
|
717
|
+
/**
|
|
718
|
+
* Pause a scheduled charge. No reminders fire while paused. Resume
|
|
719
|
+
* returns it to `scheduled`. Allowed from
|
|
720
|
+
* `scheduled` / `due_today` / `overdue`.
|
|
721
|
+
*
|
|
722
|
+
* @example
|
|
723
|
+
* await garu.scheduledCharges.pause('sch_abc123', { reason: 'em negociação' });
|
|
724
|
+
*/
|
|
725
|
+
pause(id: string, params?: PauseScheduledChargeParams): Promise<ScheduledChargeRecord>;
|
|
726
|
+
/**
|
|
727
|
+
* Resume a paused scheduled charge. Only valid from `paused`.
|
|
728
|
+
*
|
|
729
|
+
* @example
|
|
730
|
+
* await garu.scheduledCharges.resume('sch_abc123');
|
|
731
|
+
*/
|
|
732
|
+
resume(id: string): Promise<ScheduledChargeRecord>;
|
|
733
|
+
/**
|
|
734
|
+
* Manually mark a scheduled charge as paid, e.g. when the customer paid
|
|
735
|
+
* outside Garu (bank transfer, cash). Allowed from `due_today` / `overdue`.
|
|
736
|
+
*
|
|
737
|
+
* @example
|
|
738
|
+
* await garu.scheduledCharges.markPaid('sch_abc123', {
|
|
739
|
+
* paymentDate: '2026-06-20',
|
|
740
|
+
* externalReference: 'TED 4472881'
|
|
741
|
+
* });
|
|
742
|
+
*/
|
|
743
|
+
markPaid(id: string, params: MarkPaidScheduledChargeParams): Promise<ScheduledChargeRecord>;
|
|
744
|
+
}
|
|
745
|
+
|
|
498
746
|
interface GaruOptions {
|
|
499
747
|
/**
|
|
500
748
|
* Your Garu API key. `sk_live_…` for production, `sk_test_…` for test mode.
|
|
@@ -534,6 +782,7 @@ declare class Garu {
|
|
|
534
782
|
readonly customers: Customers;
|
|
535
783
|
readonly meta: Meta;
|
|
536
784
|
readonly products: Products;
|
|
785
|
+
readonly scheduledCharges: ScheduledCharges;
|
|
537
786
|
/**
|
|
538
787
|
* Webhook helpers. Available both as an instance member and as a static —
|
|
539
788
|
* `Garu.webhooks.verify(...)` works without constructing a client.
|
|
@@ -592,4 +841,4 @@ declare class GaruServerError extends GaruAPIError {
|
|
|
592
841
|
constructor(message: string, status: number, requestId: string | null, body: unknown);
|
|
593
842
|
}
|
|
594
843
|
|
|
595
|
-
export { type CardInfo, type Charge, type ChargeList, type ChargeStatus, type CreateChargeParams, type CreateCustomerParams, type Customer, type CustomerList, type CustomerRecord, Garu, GaruAPIError, GaruAuthenticationError, GaruConnectionError, GaruError, type GaruErrorCode, GaruNotFoundError, type GaruOptions, GaruPermissionError, GaruRateLimitError, GaruServerError, GaruSignatureVerificationError, GaruValidationError, type ListChargesParams, type ListCustomersParams, type ListProductsParams, type MetaFeatures, type MetaResponse, type PaginatedList, type PaymentMethod, type Product, type ProductList, type RefundChargeParams, type UpdateCustomerParams, type VerifiedWebhook, type VerifyWebhookParams, type WirePaymentMethodId, webhooks };
|
|
844
|
+
export { type CardInfo, type Charge, type ChargeList, type ChargeStatus, type CreateChargeParams, type CreateCustomerParams, type CreateScheduledChargeParams, type Customer, type CustomerList, type CustomerRecord, Garu, GaruAPIError, GaruAuthenticationError, GaruConnectionError, GaruError, type GaruErrorCode, GaruNotFoundError, type GaruOptions, GaruPermissionError, GaruRateLimitError, GaruServerError, GaruSignatureVerificationError, GaruValidationError, type ListChargesParams, type ListCustomersParams, type ListProductsParams, type ListScheduledChargesParams, type MarkPaidScheduledChargeParams, type MetaFeatures, type MetaResponse, type PaginatedList, type PauseScheduledChargeParams, type PaymentMethod, type PostponeScheduledChargeParams, type Product, type ProductList, type RefundChargeParams, type ScheduledChargeActor, type ScheduledChargeDetail, type ScheduledChargeEvent, type ScheduledChargeEventType, type ScheduledChargeLinkedTransaction, type ScheduledChargeList, type ScheduledChargeRecord, type ScheduledChargeStatus, type ScheduledChargeType, type ScheduledPaymentMethod, type UpdateCustomerParams, type VerifiedWebhook, type VerifyWebhookParams, type WirePaymentMethodId, webhooks };
|
package/dist/index.d.ts
CHANGED
|
@@ -219,8 +219,22 @@ interface CustomerRecord {
|
|
|
219
219
|
state?: string | null;
|
|
220
220
|
createdAt: string;
|
|
221
221
|
updatedAt: string;
|
|
222
|
+
/**
|
|
223
|
+
* Resolved billing email used for outbound seller→customer emails:
|
|
224
|
+
* `billingEmailOverride ?? per-seller email ?? customer.email`.
|
|
225
|
+
*/
|
|
226
|
+
billingEmail?: string;
|
|
227
|
+
/** True when a sticky `billingEmailOverride` is set for this seller. */
|
|
228
|
+
hasBillingEmailOverride?: boolean;
|
|
222
229
|
[key: string]: unknown;
|
|
223
230
|
}
|
|
231
|
+
interface SetBillingEmailOverrideParams {
|
|
232
|
+
/**
|
|
233
|
+
* Customer-controlled billing email. Pass `null` to clear and fall back to
|
|
234
|
+
* the per-seller last-used email or the global `customer.email`.
|
|
235
|
+
*/
|
|
236
|
+
billingEmailOverride: string | null;
|
|
237
|
+
}
|
|
224
238
|
type CustomerList = PaginatedList<CustomerRecord>;
|
|
225
239
|
interface CreateCustomerParams {
|
|
226
240
|
name: string;
|
|
@@ -258,6 +272,127 @@ interface ListCustomersParams {
|
|
|
258
272
|
page?: number;
|
|
259
273
|
limit?: number;
|
|
260
274
|
search?: string;
|
|
275
|
+
/** Filter by aggregated status. `overdue` returns customers with at least one overdue scheduled charge. */
|
|
276
|
+
status?: 'overdue';
|
|
277
|
+
}
|
|
278
|
+
type ScheduledChargeStatus = 'scheduled' | 'due_today' | 'overdue' | 'paid' | 'paused' | 'canceled' | 'trial' | 'pending_tokenization' | 'recurrence_canceled';
|
|
279
|
+
type ScheduledChargeType = 'one_time' | 'recurring';
|
|
280
|
+
type ScheduledPaymentMethod = 'pix' | 'boleto';
|
|
281
|
+
type ScheduledChargeEventType = 'created' | 'postponed' | 'paused' | 'resumed' | 'recurrence_canceled' | 'manually_marked_paid' | 'paid' | 'overdue_reminder_sent' | 'd_day_reminder_sent';
|
|
282
|
+
type ScheduledChargeActor = {
|
|
283
|
+
type: 'user';
|
|
284
|
+
id: number;
|
|
285
|
+
} | {
|
|
286
|
+
type: 'api_key';
|
|
287
|
+
id: number;
|
|
288
|
+
} | {
|
|
289
|
+
type: 'system';
|
|
290
|
+
};
|
|
291
|
+
interface ScheduledChargeRecord {
|
|
292
|
+
id: string;
|
|
293
|
+
sellerId: number;
|
|
294
|
+
customerId: number;
|
|
295
|
+
productId: number | null;
|
|
296
|
+
/** Decimal BRL (e.g. `297.50`), never centavos. */
|
|
297
|
+
amount: number;
|
|
298
|
+
description: string | null;
|
|
299
|
+
type: ScheduledChargeType;
|
|
300
|
+
/** YYYY-MM-DD in São Paulo time. */
|
|
301
|
+
dueDate: string;
|
|
302
|
+
methods: ScheduledPaymentMethod[];
|
|
303
|
+
status: ScheduledChargeStatus;
|
|
304
|
+
externalReference: string | null;
|
|
305
|
+
metadata: Record<string, unknown> | null;
|
|
306
|
+
createdAt: string;
|
|
307
|
+
updatedAt: string;
|
|
308
|
+
/** Eager-loaded customer (id/name/email/document only). */
|
|
309
|
+
customer?: {
|
|
310
|
+
id: number;
|
|
311
|
+
name: string;
|
|
312
|
+
email: string;
|
|
313
|
+
document: string;
|
|
314
|
+
} | null;
|
|
315
|
+
/** Eager-loaded product (id/uuid/name only). */
|
|
316
|
+
product?: {
|
|
317
|
+
id: number;
|
|
318
|
+
uuid: string;
|
|
319
|
+
name: string;
|
|
320
|
+
} | null;
|
|
321
|
+
[key: string]: unknown;
|
|
322
|
+
}
|
|
323
|
+
interface ScheduledChargeEvent {
|
|
324
|
+
id: number;
|
|
325
|
+
scheduledChargeId: string;
|
|
326
|
+
eventType: ScheduledChargeEventType;
|
|
327
|
+
actor: ScheduledChargeActor;
|
|
328
|
+
payload: Record<string, unknown> | null;
|
|
329
|
+
createdAt: string;
|
|
330
|
+
}
|
|
331
|
+
interface ScheduledChargeLinkedTransaction {
|
|
332
|
+
id: number;
|
|
333
|
+
/** Centavos (BRL × 100), matching `garu.charges.*` value semantics. */
|
|
334
|
+
value: number;
|
|
335
|
+
paymentMethod: string;
|
|
336
|
+
status: string;
|
|
337
|
+
date: string;
|
|
338
|
+
refundedAt: string | null;
|
|
339
|
+
[key: string]: unknown;
|
|
340
|
+
}
|
|
341
|
+
interface ScheduledChargeDetail {
|
|
342
|
+
charge: ScheduledChargeRecord;
|
|
343
|
+
events: ScheduledChargeEvent[];
|
|
344
|
+
transactions: ScheduledChargeLinkedTransaction[];
|
|
345
|
+
}
|
|
346
|
+
type ScheduledChargeList = PaginatedList<ScheduledChargeRecord>;
|
|
347
|
+
interface CreateScheduledChargeParams {
|
|
348
|
+
customerId: number;
|
|
349
|
+
productId?: number;
|
|
350
|
+
/** Decimal BRL (e.g. `297.50`). */
|
|
351
|
+
amount: number;
|
|
352
|
+
description?: string;
|
|
353
|
+
/**
|
|
354
|
+
* Schedule type. Only `one_time` is accepted by the current API; the
|
|
355
|
+
* literal narrows to that until recurring schedules ship.
|
|
356
|
+
*/
|
|
357
|
+
type: 'one_time';
|
|
358
|
+
/** YYYY-MM-DD in São Paulo time. Must be today or future. */
|
|
359
|
+
dueDate: string;
|
|
360
|
+
/** PIX and Boleto are supported now; card requires tokenization (future). */
|
|
361
|
+
methods: ScheduledPaymentMethod[];
|
|
362
|
+
externalReference?: string;
|
|
363
|
+
metadata?: Record<string, unknown>;
|
|
364
|
+
/**
|
|
365
|
+
* Optional idempotency key for safe retries. The SDK auto-generates a
|
|
366
|
+
* UUIDv4 when omitted and forwards it as `X-Idempotency-Key`.
|
|
367
|
+
*/
|
|
368
|
+
idempotencyKey?: string;
|
|
369
|
+
}
|
|
370
|
+
interface ListScheduledChargesParams {
|
|
371
|
+
page?: number;
|
|
372
|
+
limit?: number;
|
|
373
|
+
customerId?: number;
|
|
374
|
+
status?: ScheduledChargeStatus | ScheduledChargeStatus[];
|
|
375
|
+
type?: ScheduledChargeType;
|
|
376
|
+
/** YYYY-MM-DD lower bound for `dueDate`. */
|
|
377
|
+
dueFrom?: string;
|
|
378
|
+
/** YYYY-MM-DD upper bound for `dueDate`. */
|
|
379
|
+
dueTo?: string;
|
|
380
|
+
/** Free-text match against customer name / email / document. */
|
|
381
|
+
search?: string;
|
|
382
|
+
}
|
|
383
|
+
interface PostponeScheduledChargeParams {
|
|
384
|
+
/** YYYY-MM-DD in São Paulo time. Must be today or future. */
|
|
385
|
+
newDueDate: string;
|
|
386
|
+
reason?: string;
|
|
387
|
+
}
|
|
388
|
+
interface PauseScheduledChargeParams {
|
|
389
|
+
reason?: string;
|
|
390
|
+
}
|
|
391
|
+
interface MarkPaidScheduledChargeParams {
|
|
392
|
+
/** YYYY-MM-DD in São Paulo time. Must be today or past. */
|
|
393
|
+
paymentDate: string;
|
|
394
|
+
/** Bank reference, internal ID, or any stable string for reconciliation. */
|
|
395
|
+
externalReference?: string;
|
|
261
396
|
}
|
|
262
397
|
interface Product {
|
|
263
398
|
id: number;
|
|
@@ -406,7 +541,7 @@ declare class Customers {
|
|
|
406
541
|
private readonly http;
|
|
407
542
|
constructor(http: HttpClient);
|
|
408
543
|
/**
|
|
409
|
-
*
|
|
544
|
+
* Register a customer for the current seller.
|
|
410
545
|
*
|
|
411
546
|
* @example
|
|
412
547
|
* const customer = await garu.customers.create({
|
|
@@ -439,6 +574,23 @@ declare class Customers {
|
|
|
439
574
|
* const updated = await garu.customers.update(42, { name: 'Maria Santos' });
|
|
440
575
|
*/
|
|
441
576
|
update(id: number, params: UpdateCustomerParams): Promise<CustomerRecord>;
|
|
577
|
+
/**
|
|
578
|
+
* Set or clear the per-seller billing email override.
|
|
579
|
+
*
|
|
580
|
+
* The override is sticky: it takes precedence over the per-seller last-used
|
|
581
|
+
* email and the global `customer.email` for outbound seller→customer emails,
|
|
582
|
+
* and is **never** auto-overwritten by subsequent payments or registrations.
|
|
583
|
+
*
|
|
584
|
+
* @example
|
|
585
|
+
* // Set
|
|
586
|
+
* await garu.customers.setBillingEmailOverride(42, {
|
|
587
|
+
* billingEmailOverride: 'cobrancas@empresa.com.br'
|
|
588
|
+
* });
|
|
589
|
+
*
|
|
590
|
+
* // Clear and fall back to the last-used email
|
|
591
|
+
* await garu.customers.setBillingEmailOverride(42, { billingEmailOverride: null });
|
|
592
|
+
*/
|
|
593
|
+
setBillingEmailOverride(id: number, params: SetBillingEmailOverrideParams): Promise<CustomerRecord>;
|
|
442
594
|
/**
|
|
443
595
|
* Remove a customer from the current seller.
|
|
444
596
|
*
|
|
@@ -495,6 +647,102 @@ declare class Products {
|
|
|
495
647
|
get(uuid: string): Promise<Product>;
|
|
496
648
|
}
|
|
497
649
|
|
|
650
|
+
/**
|
|
651
|
+
* Scheduled charges — bill a customer on a future date.
|
|
652
|
+
*
|
|
653
|
+
* The seller registers a customer (see `garu.customers.create`), then
|
|
654
|
+
* schedules one or more charges (PIX or Boleto). Garu drives the rest:
|
|
655
|
+
* pre-charge customer email on the due date, dunning to the seller team
|
|
656
|
+
* after the due date, and a state machine for postpone/pause/resume/
|
|
657
|
+
* mark-paid actions.
|
|
658
|
+
*
|
|
659
|
+
* Recurring schedules are reserved for a future API version; the current
|
|
660
|
+
* `type` field accepts only `one_time`.
|
|
661
|
+
*/
|
|
662
|
+
declare class ScheduledCharges {
|
|
663
|
+
private readonly http;
|
|
664
|
+
constructor(http: HttpClient);
|
|
665
|
+
/**
|
|
666
|
+
* Create a new scheduled charge. Auto-attaches `X-Idempotency-Key`
|
|
667
|
+
* (UUIDv4 if you don't pass `idempotencyKey`) so retries on transient
|
|
668
|
+
* network failures don't silently double-create.
|
|
669
|
+
*
|
|
670
|
+
* @example
|
|
671
|
+
* const charge = await garu.scheduledCharges.create({
|
|
672
|
+
* customerId: 42,
|
|
673
|
+
* amount: 297.50,
|
|
674
|
+
* type: 'one_time',
|
|
675
|
+
* dueDate: '2026-06-15',
|
|
676
|
+
* methods: ['pix', 'boleto'],
|
|
677
|
+
* description: 'Mensalidade Junho'
|
|
678
|
+
* });
|
|
679
|
+
*/
|
|
680
|
+
create(params: CreateScheduledChargeParams): Promise<ScheduledChargeRecord>;
|
|
681
|
+
/**
|
|
682
|
+
* List scheduled charges for the authenticated seller, with pagination
|
|
683
|
+
* and filters. Repeat the `status` array to filter on multiple values.
|
|
684
|
+
*
|
|
685
|
+
* @example
|
|
686
|
+
* const overdue = await garu.scheduledCharges.list({ status: 'overdue', limit: 50 });
|
|
687
|
+
*
|
|
688
|
+
* @example
|
|
689
|
+
* const upcoming = await garu.scheduledCharges.list({
|
|
690
|
+
* status: ['scheduled', 'due_today'],
|
|
691
|
+
* dueFrom: '2026-06-01',
|
|
692
|
+
* dueTo: '2026-06-30'
|
|
693
|
+
* });
|
|
694
|
+
*/
|
|
695
|
+
list(params?: ListScheduledChargesParams): Promise<ScheduledChargeList>;
|
|
696
|
+
/**
|
|
697
|
+
* Fetch a single scheduled charge by ID, bundled with its event timeline
|
|
698
|
+
* and any linked Garu transactions.
|
|
699
|
+
*
|
|
700
|
+
* @example
|
|
701
|
+
* const { charge, events, transactions } = await garu.scheduledCharges.get('sch_abc123');
|
|
702
|
+
* // charge.status, events[].eventType, transactions[].status
|
|
703
|
+
*/
|
|
704
|
+
get(id: string): Promise<ScheduledChargeDetail>;
|
|
705
|
+
/**
|
|
706
|
+
* Postpone a scheduled charge to a new due date. Allowed from
|
|
707
|
+
* `scheduled` / `due_today` / `overdue` / `paused`. Clears any pending
|
|
708
|
+
* dunning so the new dueDate triggers a fresh customer reminder.
|
|
709
|
+
*
|
|
710
|
+
* @example
|
|
711
|
+
* await garu.scheduledCharges.postpone('sch_abc123', {
|
|
712
|
+
* newDueDate: '2026-07-01',
|
|
713
|
+
* reason: 'cliente pediu mais prazo'
|
|
714
|
+
* });
|
|
715
|
+
*/
|
|
716
|
+
postpone(id: string, params: PostponeScheduledChargeParams): Promise<ScheduledChargeRecord>;
|
|
717
|
+
/**
|
|
718
|
+
* Pause a scheduled charge. No reminders fire while paused. Resume
|
|
719
|
+
* returns it to `scheduled`. Allowed from
|
|
720
|
+
* `scheduled` / `due_today` / `overdue`.
|
|
721
|
+
*
|
|
722
|
+
* @example
|
|
723
|
+
* await garu.scheduledCharges.pause('sch_abc123', { reason: 'em negociação' });
|
|
724
|
+
*/
|
|
725
|
+
pause(id: string, params?: PauseScheduledChargeParams): Promise<ScheduledChargeRecord>;
|
|
726
|
+
/**
|
|
727
|
+
* Resume a paused scheduled charge. Only valid from `paused`.
|
|
728
|
+
*
|
|
729
|
+
* @example
|
|
730
|
+
* await garu.scheduledCharges.resume('sch_abc123');
|
|
731
|
+
*/
|
|
732
|
+
resume(id: string): Promise<ScheduledChargeRecord>;
|
|
733
|
+
/**
|
|
734
|
+
* Manually mark a scheduled charge as paid, e.g. when the customer paid
|
|
735
|
+
* outside Garu (bank transfer, cash). Allowed from `due_today` / `overdue`.
|
|
736
|
+
*
|
|
737
|
+
* @example
|
|
738
|
+
* await garu.scheduledCharges.markPaid('sch_abc123', {
|
|
739
|
+
* paymentDate: '2026-06-20',
|
|
740
|
+
* externalReference: 'TED 4472881'
|
|
741
|
+
* });
|
|
742
|
+
*/
|
|
743
|
+
markPaid(id: string, params: MarkPaidScheduledChargeParams): Promise<ScheduledChargeRecord>;
|
|
744
|
+
}
|
|
745
|
+
|
|
498
746
|
interface GaruOptions {
|
|
499
747
|
/**
|
|
500
748
|
* Your Garu API key. `sk_live_…` for production, `sk_test_…` for test mode.
|
|
@@ -534,6 +782,7 @@ declare class Garu {
|
|
|
534
782
|
readonly customers: Customers;
|
|
535
783
|
readonly meta: Meta;
|
|
536
784
|
readonly products: Products;
|
|
785
|
+
readonly scheduledCharges: ScheduledCharges;
|
|
537
786
|
/**
|
|
538
787
|
* Webhook helpers. Available both as an instance member and as a static —
|
|
539
788
|
* `Garu.webhooks.verify(...)` works without constructing a client.
|
|
@@ -592,4 +841,4 @@ declare class GaruServerError extends GaruAPIError {
|
|
|
592
841
|
constructor(message: string, status: number, requestId: string | null, body: unknown);
|
|
593
842
|
}
|
|
594
843
|
|
|
595
|
-
export { type CardInfo, type Charge, type ChargeList, type ChargeStatus, type CreateChargeParams, type CreateCustomerParams, type Customer, type CustomerList, type CustomerRecord, Garu, GaruAPIError, GaruAuthenticationError, GaruConnectionError, GaruError, type GaruErrorCode, GaruNotFoundError, type GaruOptions, GaruPermissionError, GaruRateLimitError, GaruServerError, GaruSignatureVerificationError, GaruValidationError, type ListChargesParams, type ListCustomersParams, type ListProductsParams, type MetaFeatures, type MetaResponse, type PaginatedList, type PaymentMethod, type Product, type ProductList, type RefundChargeParams, type UpdateCustomerParams, type VerifiedWebhook, type VerifyWebhookParams, type WirePaymentMethodId, webhooks };
|
|
844
|
+
export { type CardInfo, type Charge, type ChargeList, type ChargeStatus, type CreateChargeParams, type CreateCustomerParams, type CreateScheduledChargeParams, type Customer, type CustomerList, type CustomerRecord, Garu, GaruAPIError, GaruAuthenticationError, GaruConnectionError, GaruError, type GaruErrorCode, GaruNotFoundError, type GaruOptions, GaruPermissionError, GaruRateLimitError, GaruServerError, GaruSignatureVerificationError, GaruValidationError, type ListChargesParams, type ListCustomersParams, type ListProductsParams, type ListScheduledChargesParams, type MarkPaidScheduledChargeParams, type MetaFeatures, type MetaResponse, type PaginatedList, type PauseScheduledChargeParams, type PaymentMethod, type PostponeScheduledChargeParams, type Product, type ProductList, type RefundChargeParams, type ScheduledChargeActor, type ScheduledChargeDetail, type ScheduledChargeEvent, type ScheduledChargeEventType, type ScheduledChargeLinkedTransaction, type ScheduledChargeList, type ScheduledChargeRecord, type ScheduledChargeStatus, type ScheduledChargeType, type ScheduledPaymentMethod, type UpdateCustomerParams, type VerifiedWebhook, type VerifyWebhookParams, type WirePaymentMethodId, webhooks };
|
package/dist/index.js
CHANGED
|
@@ -331,7 +331,7 @@ var Customers = class {
|
|
|
331
331
|
}
|
|
332
332
|
http;
|
|
333
333
|
/**
|
|
334
|
-
*
|
|
334
|
+
* Register a customer for the current seller.
|
|
335
335
|
*
|
|
336
336
|
* @example
|
|
337
337
|
* const customer = await garu.customers.create({
|
|
@@ -361,6 +361,7 @@ var Customers = class {
|
|
|
361
361
|
if (params.page !== void 0) query.page = String(params.page);
|
|
362
362
|
if (params.limit !== void 0) query.limit = String(params.limit);
|
|
363
363
|
if (params.search) query.search = params.search;
|
|
364
|
+
if (params.status) query.status = params.status;
|
|
364
365
|
const qs = new URLSearchParams(query).toString();
|
|
365
366
|
const url = `/api/customers${qs ? `?${qs}` : ""}`;
|
|
366
367
|
return this.http.call(
|
|
@@ -396,6 +397,30 @@ var Customers = class {
|
|
|
396
397
|
}).then((r) => r)
|
|
397
398
|
);
|
|
398
399
|
}
|
|
400
|
+
/**
|
|
401
|
+
* Set or clear the per-seller billing email override.
|
|
402
|
+
*
|
|
403
|
+
* The override is sticky: it takes precedence over the per-seller last-used
|
|
404
|
+
* email and the global `customer.email` for outbound seller→customer emails,
|
|
405
|
+
* and is **never** auto-overwritten by subsequent payments or registrations.
|
|
406
|
+
*
|
|
407
|
+
* @example
|
|
408
|
+
* // Set
|
|
409
|
+
* await garu.customers.setBillingEmailOverride(42, {
|
|
410
|
+
* billingEmailOverride: 'cobrancas@empresa.com.br'
|
|
411
|
+
* });
|
|
412
|
+
*
|
|
413
|
+
* // Clear and fall back to the last-used email
|
|
414
|
+
* await garu.customers.setBillingEmailOverride(42, { billingEmailOverride: null });
|
|
415
|
+
*/
|
|
416
|
+
async setBillingEmailOverride(id, params) {
|
|
417
|
+
return this.http.call(
|
|
418
|
+
(signal) => this.http.client.PATCH(`/api/customers/${id}/billing-email-override`, {
|
|
419
|
+
body: params,
|
|
420
|
+
signal
|
|
421
|
+
}).then((r) => r)
|
|
422
|
+
);
|
|
423
|
+
}
|
|
399
424
|
/**
|
|
400
425
|
* Remove a customer from the current seller.
|
|
401
426
|
*
|
|
@@ -473,6 +498,156 @@ var Products = class {
|
|
|
473
498
|
);
|
|
474
499
|
}
|
|
475
500
|
};
|
|
501
|
+
|
|
502
|
+
// src/resources/scheduled-charges.ts
|
|
503
|
+
var ScheduledCharges = class {
|
|
504
|
+
constructor(http) {
|
|
505
|
+
this.http = http;
|
|
506
|
+
}
|
|
507
|
+
http;
|
|
508
|
+
/**
|
|
509
|
+
* Create a new scheduled charge. Auto-attaches `X-Idempotency-Key`
|
|
510
|
+
* (UUIDv4 if you don't pass `idempotencyKey`) so retries on transient
|
|
511
|
+
* network failures don't silently double-create.
|
|
512
|
+
*
|
|
513
|
+
* @example
|
|
514
|
+
* const charge = await garu.scheduledCharges.create({
|
|
515
|
+
* customerId: 42,
|
|
516
|
+
* amount: 297.50,
|
|
517
|
+
* type: 'one_time',
|
|
518
|
+
* dueDate: '2026-06-15',
|
|
519
|
+
* methods: ['pix', 'boleto'],
|
|
520
|
+
* description: 'Mensalidade Junho'
|
|
521
|
+
* });
|
|
522
|
+
*/
|
|
523
|
+
async create(params) {
|
|
524
|
+
const idempotencyKey = params.idempotencyKey ?? generateIdempotencyKey();
|
|
525
|
+
const { idempotencyKey: _omit, ...body } = params;
|
|
526
|
+
return this.http.call(
|
|
527
|
+
(signal) => this.http.client.POST("/api/scheduled-charges", {
|
|
528
|
+
body,
|
|
529
|
+
headers: { "X-Idempotency-Key": idempotencyKey },
|
|
530
|
+
signal
|
|
531
|
+
}).then((r) => r)
|
|
532
|
+
);
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* List scheduled charges for the authenticated seller, with pagination
|
|
536
|
+
* and filters. Repeat the `status` array to filter on multiple values.
|
|
537
|
+
*
|
|
538
|
+
* @example
|
|
539
|
+
* const overdue = await garu.scheduledCharges.list({ status: 'overdue', limit: 50 });
|
|
540
|
+
*
|
|
541
|
+
* @example
|
|
542
|
+
* const upcoming = await garu.scheduledCharges.list({
|
|
543
|
+
* status: ['scheduled', 'due_today'],
|
|
544
|
+
* dueFrom: '2026-06-01',
|
|
545
|
+
* dueTo: '2026-06-30'
|
|
546
|
+
* });
|
|
547
|
+
*/
|
|
548
|
+
async list(params = {}) {
|
|
549
|
+
const qs = new URLSearchParams();
|
|
550
|
+
if (params.page !== void 0) qs.set("page", String(params.page));
|
|
551
|
+
if (params.limit !== void 0) qs.set("limit", String(params.limit));
|
|
552
|
+
if (params.customerId !== void 0) qs.set("customerId", String(params.customerId));
|
|
553
|
+
if (params.type) qs.set("type", params.type);
|
|
554
|
+
if (params.dueFrom) qs.set("dueFrom", params.dueFrom);
|
|
555
|
+
if (params.dueTo) qs.set("dueTo", params.dueTo);
|
|
556
|
+
if (params.search) qs.set("search", params.search);
|
|
557
|
+
if (params.status) {
|
|
558
|
+
const statuses = Array.isArray(params.status) ? params.status : [params.status];
|
|
559
|
+
for (const s of statuses) qs.append("status", s);
|
|
560
|
+
}
|
|
561
|
+
const query = qs.toString();
|
|
562
|
+
const url = `/api/scheduled-charges${query ? `?${query}` : ""}`;
|
|
563
|
+
return this.http.call(
|
|
564
|
+
(signal) => this.http.client.GET(url, { signal }).then(
|
|
565
|
+
(r) => r
|
|
566
|
+
)
|
|
567
|
+
);
|
|
568
|
+
}
|
|
569
|
+
/**
|
|
570
|
+
* Fetch a single scheduled charge by ID, bundled with its event timeline
|
|
571
|
+
* and any linked Garu transactions.
|
|
572
|
+
*
|
|
573
|
+
* @example
|
|
574
|
+
* const { charge, events, transactions } = await garu.scheduledCharges.get('sch_abc123');
|
|
575
|
+
* // charge.status, events[].eventType, transactions[].status
|
|
576
|
+
*/
|
|
577
|
+
async get(id) {
|
|
578
|
+
return this.http.call(
|
|
579
|
+
(signal) => this.http.client.GET(`/api/scheduled-charges/${id}`, { signal }).then(
|
|
580
|
+
(r) => r
|
|
581
|
+
)
|
|
582
|
+
);
|
|
583
|
+
}
|
|
584
|
+
/**
|
|
585
|
+
* Postpone a scheduled charge to a new due date. Allowed from
|
|
586
|
+
* `scheduled` / `due_today` / `overdue` / `paused`. Clears any pending
|
|
587
|
+
* dunning so the new dueDate triggers a fresh customer reminder.
|
|
588
|
+
*
|
|
589
|
+
* @example
|
|
590
|
+
* await garu.scheduledCharges.postpone('sch_abc123', {
|
|
591
|
+
* newDueDate: '2026-07-01',
|
|
592
|
+
* reason: 'cliente pediu mais prazo'
|
|
593
|
+
* });
|
|
594
|
+
*/
|
|
595
|
+
async postpone(id, params) {
|
|
596
|
+
return this.http.call(
|
|
597
|
+
(signal) => this.http.client.POST(`/api/scheduled-charges/${id}/postpone`, {
|
|
598
|
+
body: params,
|
|
599
|
+
signal
|
|
600
|
+
}).then((r) => r)
|
|
601
|
+
);
|
|
602
|
+
}
|
|
603
|
+
/**
|
|
604
|
+
* Pause a scheduled charge. No reminders fire while paused. Resume
|
|
605
|
+
* returns it to `scheduled`. Allowed from
|
|
606
|
+
* `scheduled` / `due_today` / `overdue`.
|
|
607
|
+
*
|
|
608
|
+
* @example
|
|
609
|
+
* await garu.scheduledCharges.pause('sch_abc123', { reason: 'em negociação' });
|
|
610
|
+
*/
|
|
611
|
+
async pause(id, params = {}) {
|
|
612
|
+
return this.http.call(
|
|
613
|
+
(signal) => this.http.client.POST(`/api/scheduled-charges/${id}/pause`, {
|
|
614
|
+
body: params,
|
|
615
|
+
signal
|
|
616
|
+
}).then((r) => r)
|
|
617
|
+
);
|
|
618
|
+
}
|
|
619
|
+
/**
|
|
620
|
+
* Resume a paused scheduled charge. Only valid from `paused`.
|
|
621
|
+
*
|
|
622
|
+
* @example
|
|
623
|
+
* await garu.scheduledCharges.resume('sch_abc123');
|
|
624
|
+
*/
|
|
625
|
+
async resume(id) {
|
|
626
|
+
return this.http.call(
|
|
627
|
+
(signal) => this.http.client.POST(`/api/scheduled-charges/${id}/resume`, {
|
|
628
|
+
signal
|
|
629
|
+
}).then((r) => r)
|
|
630
|
+
);
|
|
631
|
+
}
|
|
632
|
+
/**
|
|
633
|
+
* Manually mark a scheduled charge as paid, e.g. when the customer paid
|
|
634
|
+
* outside Garu (bank transfer, cash). Allowed from `due_today` / `overdue`.
|
|
635
|
+
*
|
|
636
|
+
* @example
|
|
637
|
+
* await garu.scheduledCharges.markPaid('sch_abc123', {
|
|
638
|
+
* paymentDate: '2026-06-20',
|
|
639
|
+
* externalReference: 'TED 4472881'
|
|
640
|
+
* });
|
|
641
|
+
*/
|
|
642
|
+
async markPaid(id, params) {
|
|
643
|
+
return this.http.call(
|
|
644
|
+
(signal) => this.http.client.POST(`/api/scheduled-charges/${id}/mark-paid`, {
|
|
645
|
+
body: params,
|
|
646
|
+
signal
|
|
647
|
+
}).then((r) => r)
|
|
648
|
+
);
|
|
649
|
+
}
|
|
650
|
+
};
|
|
476
651
|
var webhooks = {
|
|
477
652
|
verify(params) {
|
|
478
653
|
const { signature, secret, payload } = params;
|
|
@@ -538,6 +713,7 @@ var Garu = class {
|
|
|
538
713
|
customers;
|
|
539
714
|
meta;
|
|
540
715
|
products;
|
|
716
|
+
scheduledCharges;
|
|
541
717
|
/**
|
|
542
718
|
* Webhook helpers. Available both as an instance member and as a static —
|
|
543
719
|
* `Garu.webhooks.verify(...)` works without constructing a client.
|
|
@@ -557,6 +733,7 @@ var Garu = class {
|
|
|
557
733
|
this.customers = new Customers(http);
|
|
558
734
|
this.meta = new Meta(http);
|
|
559
735
|
this.products = new Products(http);
|
|
736
|
+
this.scheduledCharges = new ScheduledCharges(http);
|
|
560
737
|
}
|
|
561
738
|
};
|
|
562
739
|
|