wyzecash 0.1.0 → 0.3.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 ADDED
@@ -0,0 +1,33 @@
1
+ # Mudanças
2
+
3
+ ## 0.3.0 (15/11/2026)
4
+
5
+ **Atualize antes de 01/12/2026:** a 0.2.0 só lê o cabeçalho `X-Bukio-Signature`, que deixa de vir nos webhooks em 01/12/2026. A partir desse dia, o plugin `wyzecash/fastify` da 0.2.0 recusa todos os avisos.
6
+
7
+ **Mudanças que pedem ajuste no seu código:**
8
+
9
+ - Os webhooks passam a vir com os cabeçalhos `X-WyzeCash-Signature`, `X-WyzeCash-Event` e `X-WyzeCash-Delivery`. Até 30/11/2026 (23h59 de Brasília) os antigos `X-Bukio-*` vêm junto, com o mesmo valor; a partir de 01/12/2026, só os novos. A assinatura continua no mesmo formato.
10
+ - `SIGNATURE_HEADER` passa a ser `x-wyzecash-signature`; o antigo fica em `LEGACY_SIGNATURE_HEADER` (`x-bukio-signature`). O plugin `wyzecash/fastify` lê o cabeçalho novo primeiro e, sem ele, o antigo (com o plugin, nada muda no seu código). Se você lê o cabeçalho na mão, passe o `x-wyzecash-signature` para o `verifyWebhook`.
11
+ - A chave de API passa a começar com `wyze_` no lugar de `bk_live_` (a mesma chave, só o começo muda: `bk_live_ABC123_XYZ` vira `wyze_ABC123_XYZ`). A `bk_live_` vale até 30/11/2026; a partir de 01/12/2026, a API recusa com `401 OLD_KEY_PREFIX`. Troque o começo da chave na variável `WYZECASH_API_KEY`.
12
+ - As mensagens do `WyzeCashWebhookError` citam o `X-WyzeCash-Signature` (os códigos, como `MISSING_SIGNATURE`, não mudam).
13
+
14
+ **Novidades:**
15
+
16
+ - `subaccounts.updateSettings` aceita `medFeeToSubaccount`: repassar a taxa de MED à subconta (a Taxa de MED recebido de um MED numa venda da subconta sai dela).
17
+
18
+ ## 0.2.0
19
+
20
+ **Mudanças que pedem ajuste no seu código:**
21
+
22
+ - Saem `pix.send`, `pix.list` e `pix.retrieve`: enviar Pix e sacar são o mesmo Pix que sai, então use `withdrawals.create` (com `destination` ou `copyPaste`). A rota antiga `/v1/pix/payments` continua respondendo por enquanto, mas vai ser removida.
23
+ - Sai `meds.downloadAttachment`: as provas do MED são internas da WyzeCash e não se baixam pela API (a rota já recusava).
24
+
25
+ **Novidades:**
26
+
27
+ - `meds.respond(id, { defense, evidence })`: responde um MED com a defesa e até 5 provas (em base64), num pedido só. Precisa da permissão `/meds/respond` na chave.
28
+ - O endereço padrão passa a ser `https://api.wyzecash.com.br`. O antigo continua funcionando, e quem passa `baseUrl` não muda nada.
29
+ - `payments.retrieve` e `withdrawals.retrieve` explicam no editor que, para saber quando a cobrança é paga ou o saque conclui, o caminho é o webhook (ou o WebSocket), não a consulta em sequência, que gasta o limite de 100 pedidos por minuto da conta. O README ganhou a seção "Saber quando foi pago".
30
+
31
+ ## 0.1.0
32
+
33
+ Primeira versão.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # wyzecash
2
2
 
3
- SDK oficial da [WyzeCash](https://bukio.mintlify.app) para Node.js 20+, Bun e Deno: cobranças por Pix, cartão e cripto, links de pagamento, saldo e extrato, saques, Pix enviado, estornos, MED, subcontas e webhooks. Sem dependências.
3
+ SDK oficial da [WyzeCash](https://docs.wyzecash.com.br) para Node.js 20+, Bun e Deno: cobranças por Pix, cartão e cripto, links de pagamento, saldo e extrato, saques, estornos, MED, subcontas e webhooks. Sem dependências.
4
4
 
5
5
  ```bash
6
6
  npm install wyzecash
@@ -21,7 +21,7 @@ const cobranca = await wyzecash.payments.create({
21
21
  console.log(cobranca.copyPaste); // Pix Copia e Cola
22
22
  ```
23
23
 
24
- A chave de API (`bk_live_…`) é criada no painel, em Integrações e API, com uma permissão por rota. Sem passar a chave, o SDK lê a variável `WYZECASH_API_KEY`.
24
+ A chave de API (`wyze_…`) é criada no painel, em Integrações e API, com uma permissão por rota. Sem passar a chave, o SDK lê a variável `WYZECASH_API_KEY`.
25
25
 
26
26
  Não existe ambiente de testes: todo pedido é de verdade. Para testar, faça uma cobrança pequena.
27
27
 
@@ -38,8 +38,7 @@ Não existe ambiente de testes: todo pedido é de verdade. Para testar, faça um
38
38
  | `transactions` | `list`, `retrieve` |
39
39
  | `search` | `query` |
40
40
  | `receipts` | `retrieve` |
41
- | `meds` | `list`, `retrieve`, `downloadAttachment` |
42
- | `pix` | `send`, `list`, `retrieve` |
41
+ | `meds` | `list`, `retrieve`, `respond` |
43
42
  | `withdrawals` | `create`, `list`, `retrieve` |
44
43
  | `refunds` | `create`, `list`, `retrieve` |
45
44
  | `subaccounts` | `create`, `list`, `retrieve`, `update`, `delete`, `retrieveSettings`, `updateSettings`, `previewSettings`, `listEntries`, `fund`, `transfer`, `returnToAccount`, `withdraw` |
@@ -90,20 +89,31 @@ try {
90
89
 
91
90
  Opções do cliente: `new WyzeCash(chave, { maxRetries: 2, timeout: 60000, baseUrl, fetch })`.
92
91
 
92
+ ## Saber quando foi pago
93
+
94
+ **Use os webhooks ou o tempo real (WebSocket), não `payments.retrieve` em sequência.**
95
+
96
+ Chamar a consulta da cobrança em sequência para ver se ela foi paga gasta o limite de **100 pedidos por minuto da conta** (somando todas as rotas e todas as chaves). Uma tela consultando a cada 2 segundos gasta 30 por minuto; com quatro abertas, **todo** pedido da conta, até criar cobrança, volta `429 RATE_LIMITED` até liberar. Os avisos do webhook e do WebSocket não contam no limite.
97
+
98
+ - O seu sistema tem um endereço HTTPS: use os [webhooks](#webhooks) (`payment.paid`, `payment.expired`, `withdrawal.completed`...).
99
+ - Não tem (bot de Discord ou Telegram, programa num VPS): use o [tempo real](#tempo-real-websocket), de todas as cobranças ou só de uma (`ws.subscribePayment("BKY-…")`).
100
+ - A tela de "aguardando pagamento" pergunta ao **seu** servidor (que o webhook ou o WebSocket atualizou), nunca direto à WyzeCash: a chave de API não vai para o navegador nem para o app.
101
+ - `payments.retrieve` só para conferir uma vez (o webhook não chegou em alguns minutos). Sem webhook nem WebSocket, consulte no máximo a cada 5 segundos e pare na primeira situação final (`paid`, `expired` ou `refunded`).
102
+
93
103
  ## Webhooks
94
104
 
95
- Cada aviso chega com o cabeçalho `X-Bukio-Signature`. Confira sempre com o corpo cru, como chegou:
105
+ Cada aviso chega com o cabeçalho `X-WyzeCash-Signature` (junto vêm o `X-WyzeCash-Event`, com o tipo do evento, e o `X-WyzeCash-Delivery`, com o código da entrega). Até 30/11/2026 os antigos `X-Bukio-*` vêm junto, com o mesmo valor; a partir de 01/12/2026, só os novos. Confira sempre com o corpo cru, como chegou:
96
106
 
97
107
  ```ts
98
108
  import { verifyWebhook } from "wyzecash";
99
109
 
100
- const evento = await verifyWebhook(corpoCru, request.headers["x-bukio-signature"], process.env.WYZECASH_WEBHOOK_SECRET);
110
+ const evento = await verifyWebhook(corpoCru, request.headers["x-wyzecash-signature"], process.env.WYZECASH_WEBHOOK_SECRET);
101
111
  if (evento.type === "payment.paid") {
102
112
  // marque o pedido como pago (use evento.id para não processar duas vezes)
103
113
  }
104
114
  ```
105
115
 
106
- Aviso com assinatura errada, sem assinatura ou assinado há mais de 5 minutos lança `WyzeCashWebhookError`.
116
+ Aviso com assinatura errada, sem assinatura ou assinado há mais de 5 minutos lança `WyzeCashWebhookError`. Os nomes dos cabeçalhos ficam em `SIGNATURE_HEADER` (`x-wyzecash-signature`) e `LEGACY_SIGNATURE_HEADER` (o antigo, `x-bukio-signature`).
107
117
 
108
118
  ### Fastify
109
119
 
@@ -126,7 +136,7 @@ await app.register(wyzecashWebhooks, {
126
136
  await app.listen({ port: 3000 });
127
137
  ```
128
138
 
129
- O plugin lê o corpo cru só na rota dele (o resto da aplicação continua lendo JSON como sempre) e responde `200` quando deu certo, `400` quando o aviso não é da WyzeCash e `500` quando o `onEvent` falha (a WyzeCash manda de novo mais tarde).
139
+ O plugin lê o corpo cru só na rota dele (o resto da aplicação continua lendo JSON como sempre), confere o `X-WyzeCash-Signature` (sem ele, o antigo `X-Bukio-Signature`) e responde `200` quando deu certo, `400` quando o aviso não é da WyzeCash e `500` quando o `onEvent` falha (a WyzeCash manda de novo mais tarde).
130
140
 
131
141
  ## Tempo real (WebSocket)
132
142
 
@@ -147,6 +157,34 @@ ws.on("error", (erro) => console.error(erro.code, erro.message));
147
157
  - Chave apagada ou inválida fecha a conexão (código 1008) e não reconecta. `ws.close()` fecha de vez.
148
158
  - No Node 20, que não tem WebSocket, passe o do pacote `ws`: `wyzecash.realtime({ WebSocket })` com `import WebSocket from "ws"`.
149
159
 
160
+ ## Atualizar da 0.2.0
161
+
162
+ ```bash
163
+ npm install wyzecash@0.3.0
164
+ ```
165
+
166
+ > **Atualize antes de 01/12/2026.** A 0.2.0 só lê o cabeçalho `X-Bukio-Signature`, que deixa de vir nos webhooks em 01/12/2026: a partir desse dia, o plugin `wyzecash/fastify` da 0.2.0 recusa todos os avisos.
167
+
168
+ | Na 0.2.0 | Na 0.3.0 |
169
+ | --- | --- |
170
+ | Cabeçalho `X-Bukio-Signature` | `X-WyzeCash-Signature`. Até 30/11/2026 o antigo vem junto, com o mesmo valor |
171
+ | `SIGNATURE_HEADER` é `x-bukio-signature` | `SIGNATURE_HEADER` é `x-wyzecash-signature`, e o antigo fica em `LEGACY_SIGNATURE_HEADER` |
172
+ | Chave de API `bk_live_…` | `wyze_…` (a mesma chave, só o começo muda) |
173
+
174
+ **Webhooks:** com o plugin `wyzecash/fastify`, nada muda no seu código: ele lê o cabeçalho novo e, sem ele, o antigo. Se você lê o cabeçalho na mão, passe o novo para o `verifyWebhook` (a assinatura continua no mesmo formato):
175
+
176
+ ```ts
177
+ // Antes (0.2.0)
178
+ const evento = await verifyWebhook(corpoCru, request.headers["x-bukio-signature"], process.env.WYZECASH_WEBHOOK_SECRET);
179
+
180
+ // Agora (0.3.0)
181
+ const evento = await verifyWebhook(corpoCru, request.headers["x-wyzecash-signature"], process.env.WYZECASH_WEBHOOK_SECRET);
182
+ ```
183
+
184
+ **Chave de API:** troque o começo da chave onde ela fica guardada (a variável `WYZECASH_API_KEY`): `bk_live_ABC123_XYZ` vira `wyze_ABC123_XYZ`. A `bk_live_` vale até 30/11/2026; a partir de 01/12/2026, a API recusa com `401 OLD_KEY_PREFIX`. O resto do código não muda.
185
+
186
+ **O que mais mudou:** `subaccounts.updateSettings` aceita `medFeeToSubaccount`, para repassar a taxa de MED à subconta.
187
+
150
188
  ## Documentação
151
189
 
152
- Referência completa da API: https://bukio.mintlify.app
190
+ Referência completa da API: https://docs.wyzecash.com.br
package/dist/client.d.ts CHANGED
@@ -3,9 +3,9 @@ import { type OperationId, Resources } from "./generated.js";
3
3
  import { ListPromise } from "./pagination.js";
4
4
  import { RealtimeConnection, type RealtimeOptions } from "./realtime.js";
5
5
  import { Webhooks } from "./webhooks.js";
6
- export declare const DEFAULT_BASE_URL = "https://bukio-backend-production.up.railway.app";
6
+ export declare const DEFAULT_BASE_URL = "https://api.wyzecash.com.br";
7
7
  export interface ClientOptions {
8
- /** A chave de API (`bk_live_…`). Sem ela, vale a variável de ambiente `WYZECASH_API_KEY`. */
8
+ /** A chave de API (`wyze_…`). Sem ela, vale a variável de ambiente `WYZECASH_API_KEY`. */
9
9
  apiKey?: string;
10
10
  /** Endereço da API (padrão: o de produção). */
11
11
  baseUrl?: string;
package/dist/client.js CHANGED
@@ -11,7 +11,7 @@ import { ListPromise } from "./pagination.js";
11
11
  import { RealtimeConnection } from "./realtime.js";
12
12
  import { VERSION } from "./version.js";
13
13
  import { Webhooks } from "./webhooks.js";
14
- export const DEFAULT_BASE_URL = "https://bukio-backend-production.up.railway.app";
14
+ export const DEFAULT_BASE_URL = "https://api.wyzecash.com.br";
15
15
  const env = (name) => globalThis.process?.env?.[name];
16
16
  const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
17
17
  export class WyzeCash extends Resources {
package/dist/fastify.js CHANGED
@@ -7,13 +7,21 @@
7
7
  // async onEvent(evento) { if (evento.type === "payment.paid") ... },
8
8
  // });
9
9
  //
10
- // A rota lê o corpo cru (a assinatura é conferida nos bytes como chegaram). O plugin não é
11
- // "fastify-plugin" de propósito: a troca do leitor de JSON fica só dentro dele e o resto da sua
12
- // aplicação continua lendo JSON como sempre. Responde 200 quando deu certo, 400 quando o aviso não
13
- // é da WyzeCash e 500 quando o seu onEvent falha (aí a WyzeCash manda de novo mais tarde).
10
+ // A rota lê o corpo cru (a assinatura é conferida nos bytes como chegaram) e a assinatura do
11
+ // cabeçalho X-WyzeCash-Signature; sem ele, a do antigo X-Bukio-Signature, que vem junto até
12
+ // 30/11/2026. O plugin não é "fastify-plugin" de propósito: a troca do leitor de JSON fica só
13
+ // dentro dele e o resto da sua aplicação continua lendo JSON como sempre. Responde 200 quando deu
14
+ // certo, 400 quando o aviso não é da WyzeCash e 500 quando o seu onEvent falha (aí a WyzeCash
15
+ // manda de novo mais tarde).
14
16
  import { WyzeCashWebhookError } from "./errors.js";
15
- import { SIGNATURE_HEADER, verifyWebhook } from "./webhooks.js";
17
+ import { LEGACY_SIGNATURE_HEADER, SIGNATURE_HEADER, verifyWebhook } from "./webhooks.js";
16
18
  const env = (name) => globalThis.process?.env?.[name];
19
+ /** O valor de um cabeçalho (o primeiro, se vier repetido), ou nada quando falta ou vem vazio. */
20
+ function header(request, name) {
21
+ const value = request.headers[name];
22
+ const text = Array.isArray(value) ? value[0] : value;
23
+ return text || undefined;
24
+ }
17
25
  export async function wyzecashWebhooks(fastify, options) {
18
26
  const secret = options.secret ?? env("WYZECASH_WEBHOOK_SECRET");
19
27
  if (!secret)
@@ -28,7 +36,7 @@ export async function wyzecashWebhooks(fastify, options) {
28
36
  return reply.code(400).send({ error: "Corpo do aviso vazio ou fora do JSON." });
29
37
  let event;
30
38
  try {
31
- event = await verifyWebhook(raw, request.headers[SIGNATURE_HEADER], secret, { tolerance: options.tolerance });
39
+ event = await verifyWebhook(raw, header(request, SIGNATURE_HEADER) ?? header(request, LEGACY_SIGNATURE_HEADER), secret, { tolerance: options.tolerance });
32
40
  }
33
41
  catch (error) {
34
42
  if (error instanceof WyzeCashWebhookError) {
@@ -1362,153 +1362,74 @@ export type MedsRetrieveResponse = {
1362
1362
  /** Quando foi criado. */
1363
1363
  createdAt: string;
1364
1364
  };
1365
- /** Pedido de `pix.send` (Enviar Pix). */
1366
- export type PixSendParams = {
1367
- /** Valor do Pix, em centavos. Com Copia e Cola que já tem valor, pode ficar sem ou precisa ser o mesmo. */
1368
- amount?: number;
1369
- /** Para onde vai o Pix. */
1370
- destination?: {
1371
- /** Tipo da chave Pix: `cpf`, `cnpj`, `email`, `phone` ou `random`. */
1372
- keyType: "cpf" | "cnpj" | "email" | "phone" | "random";
1373
- /** A chave Pix. */
1374
- key: string;
1375
- };
1376
- /** Pix Copia e Cola estático para pagar (no lugar de `destination`). */
1377
- copyPaste?: string;
1378
- /** A sua referência (ex.: o número do pedido). Volta no Pix enviado e no webhook. */
1379
- description?: string;
1380
- };
1381
- /** Resposta de `pix.send` (Enviar Pix). */
1382
- export type PixSendResponse = {
1383
- /** Código. */
1384
- id: string;
1385
- /** `processing` (Em processamento), `completed` (Concluído), `failed` ou `rejected` (Não realizado: o valor volta ao saldo). */
1386
- status: string;
1387
- /** Valor do Pix, em centavos. Com Copia e Cola que já tem valor, pode ficar sem ou precisa ser o mesmo. */
1388
- amount: number;
1389
- /** Tarifa, em centavos. */
1390
- fee: number;
1391
- /** O que sai no total (valor + tarifa), em centavos. */
1392
- total: number;
1393
- /** De onde foi pedido: `painel`, `app`, `api` ou `auto` (saque automático). */
1394
- channel: string;
1395
- /** A sua referência (ex.: o número do pedido). Volta no Pix enviado e no webhook. */
1396
- description: string | null;
1397
- /** Para onde vai o Pix. */
1398
- destination: {
1399
- /** Nome de quem recebe (o que o banco confirmou). */
1400
- name: string;
1401
- /** Banco de quem recebe. */
1402
- institution: string | null;
1403
- /** Tipo da chave Pix: `cpf`, `cnpj`, `email`, `phone` ou `random`. */
1404
- keyType: string | null;
1405
- /** A chave Pix. */
1406
- key: string;
1407
- /** Pix Copia e Cola. */
1408
- copyPaste: boolean;
1409
- };
1410
- /** Identificador do Pix no Banco Central (E2E). */
1411
- endToEndId: string | null;
1412
- /** Por que não foi feito. */
1413
- failureReason: string | null;
1414
- /** Quando foi criado. */
1415
- createdAt: string;
1416
- /** Quando foi concluído. */
1417
- completedAt: string | null;
1418
- /** Link público do comprovante (imagem). `null` até concluir. */
1419
- receiptUrl: string | null;
1420
- };
1421
- /** Pedido de `pix.list` (Listar Pix enviados). */
1422
- export type PixListParams = {
1423
- /** Quantos por página (até 100). */
1424
- limit?: number;
1425
- /** O `nextCursor` da página anterior. */
1426
- cursor?: string;
1427
- };
1428
- /** Resposta de `pix.list` (Listar Pix enviados). */
1429
- export type PixListResponse = {
1430
- /** Os itens desta página. */
1431
- items: Array<{
1432
- /** Código. */
1433
- id: string;
1434
- /** Situação. */
1435
- status: string;
1436
- /** Valor, em centavos. */
1437
- amount: number;
1438
- /** Tarifa, em centavos. */
1439
- fee: number;
1440
- /** O que sai no total (valor + tarifa), em centavos. */
1441
- total: number;
1442
- /** De onde foi pedido: `painel`, `app`, `api` ou `auto` (saque automático). */
1443
- channel: string;
1444
- /** Descrição. */
1445
- description: string | null;
1446
- /** Para onde vai o Pix. */
1447
- destination: {
1448
- /** Nome de quem recebe (o que o banco confirmou). */
1449
- name: string;
1450
- /** Banco de quem recebe. */
1451
- institution: string;
1452
- /** Tipo da chave Pix: `cpf`, `cnpj`, `email`, `phone` ou `random`. */
1453
- keyType: string;
1454
- /** A chave Pix. */
1455
- key: string;
1456
- /** Pix Copia e Cola. */
1457
- copyPaste: boolean;
1458
- };
1459
- /** Identificador do Pix no Banco Central (E2E). */
1460
- endToEndId: string;
1461
- /** Por que não foi feito. */
1462
- failureReason: string | null;
1463
- /** Quando foi criado. */
1464
- createdAt: string;
1465
- /** Quando foi concluído. */
1466
- completedAt: string;
1467
- /** Link público do comprovante (imagem). `null` até concluir. */
1468
- receiptUrl: string;
1365
+ /** Pedido de `meds.respond` (Responder MED). */
1366
+ export type MedsRespondParams = {
1367
+ /** A defesa que você escreveu (a automática nunca aparece). */
1368
+ defense: string;
1369
+ evidence?: Array<{
1370
+ fileName?: string;
1371
+ contentBase64: string;
1469
1372
  }>;
1470
- /** Cursor da próxima página (`null` no fim). Mande em `cursor`. */
1471
- nextCursor: string | null;
1472
1373
  };
1473
- /** Resposta de `pix.retrieve` (Consultar Pix enviado). */
1474
- export type PixRetrieveResponse = {
1374
+ /** Resposta de `meds.respond` (Responder MED). */
1375
+ export type MedsRespondResponse = {
1475
1376
  /** Código. */
1476
1377
  id: string;
1477
- /** `processing` (Em processamento), `completed` (Concluído), `failed` ou `rejected` (Não realizado: o valor volta ao saldo). */
1378
+ /** A venda paga em que o MED foi aberto. */
1379
+ original: unknown;
1380
+ /** Situação. */
1478
1381
  status: string;
1382
+ /** Situação em texto, como aparece no painel. */
1383
+ statusTitle: string;
1479
1384
  /** Valor, em centavos. */
1480
1385
  amount: number;
1386
+ /** Reservado (MED ou estorno em andamento), em centavos. */
1387
+ blocked: number;
1388
+ /** O que ficou faltando quando foi devolvido sem saldo, em centavos. */
1389
+ owed: number;
1481
1390
  /** Tarifa, em centavos. */
1482
1391
  fee: number;
1483
- /** O que sai no total (valor + tarifa), em centavos. */
1484
- total: number;
1485
- /** De onde foi pedido: `painel`, `app`, `api` ou `auto` (saque automático). */
1486
- channel: string;
1392
+ /** Taxa de MED recebido, em centavos. */
1393
+ receivedFee: number;
1394
+ /** Parte da Taxa de MED recebido que ficou para as próximas entradas, em centavos. */
1395
+ receivedFeeOwed: number;
1396
+ /** Motivo. */
1397
+ reason: string;
1398
+ /** Motivo em texto. */
1399
+ reasonTitle: string;
1487
1400
  /** Descrição. */
1488
1401
  description: string | null;
1489
- /** Para onde vai o Pix. */
1490
- destination: {
1491
- /** Nome de quem recebe (o que o banco confirmou). */
1402
+ /** Prazo para responder. */
1403
+ deadline: string;
1404
+ /** A defesa que você escreveu (a automática nunca aparece). */
1405
+ defense: string;
1406
+ /** Quem respondeu: `user` (você), `auto` (defesa automática) ou `null`. */
1407
+ answered: string;
1408
+ /** Quando foi respondido. */
1409
+ answeredAt: string;
1410
+ /** Origem da defesa: `user` ou `auto`. */
1411
+ defenseSource: string;
1412
+ /** Arquivos enviados como prova. */
1413
+ attachments: Array<{
1414
+ /** Código do anexo. */
1415
+ id: string;
1416
+ /** Nome do arquivo. */
1492
1417
  name: string;
1493
- /** Banco de quem recebe. */
1494
- institution: string;
1495
- /** Tipo da chave Pix: `cpf`, `cnpj`, `email`, `phone` ou `random`. */
1496
- keyType: string;
1497
- /** A chave Pix. */
1498
- key: string;
1499
- /** Pix Copia e Cola. */
1500
- copyPaste: boolean;
1501
- };
1502
- /** Identificador do Pix no Banco Central (E2E). */
1503
- endToEndId: string | null;
1504
- /** Por que não foi feito. */
1505
- failureReason: string | null;
1418
+ /** Tamanho, em bytes. */
1419
+ size: number;
1420
+ /** Tipo do arquivo. */
1421
+ contentType: string;
1422
+ /** Quando foi criado. */
1423
+ createdAt: string;
1424
+ }>;
1425
+ /** Observação da decisão. */
1426
+ decisionNote: string | null;
1427
+ /** Quando a defesa foi enviada. */
1428
+ defenseAt: string;
1429
+ /** Quando foi decidido. */
1430
+ decidedAt: unknown;
1506
1431
  /** Quando foi criado. */
1507
1432
  createdAt: string;
1508
- /** Quando foi concluído. */
1509
- completedAt: string | null;
1510
- /** Link público do comprovante (imagem). `null` até concluir. */
1511
- receiptUrl: string | null;
1512
1433
  };
1513
1434
  /** Pedido de `withdrawals.create` (Sacar). */
1514
1435
  export type WithdrawalsCreateParams = {
@@ -1901,6 +1822,8 @@ export type SubaccountsCreateResponse = {
1901
1822
  active: boolean;
1902
1823
  /** Bloqueio: `none`, `receive` (não recebe), `withdraw` (não saca) ou `full` (bloqueio total). Devolver à principal sempre vale. */
1903
1824
  lockMode: string;
1825
+ /** Bloqueio da WyzeCash: `none`, `receive` (não recebe), `withdraw` (não saca, não transfere, não devolve à principal e não é excluída) ou `full` (os dois). Vale por cima do `lockMode` e só a WyzeCash tira. */
1826
+ platformLock: string;
1904
1827
  /** Saque travado pelo bloqueio automático do MED. */
1905
1828
  medLocked: boolean;
1906
1829
  /** O que falta reservar ou pagar do MED, em centavos (sai das próximas entradas da subconta). */
@@ -1996,6 +1919,8 @@ export type SubaccountsListResponse = {
1996
1919
  active: boolean;
1997
1920
  /** Bloqueio: `none`, `receive` (não recebe), `withdraw` (não saca) ou `full` (bloqueio total). Devolver à principal sempre vale. */
1998
1921
  lockMode: string;
1922
+ /** Bloqueio da WyzeCash: `none`, `receive` (não recebe), `withdraw` (não saca, não transfere, não devolve à principal e não é excluída) ou `full` (os dois). Vale por cima do `lockMode` e só a WyzeCash tira. */
1923
+ platformLock: string;
1999
1924
  /** Saque travado pelo bloqueio automático do MED. */
2000
1925
  medLocked: boolean;
2001
1926
  /** O que falta reservar ou pagar do MED, em centavos (sai das próximas entradas da subconta). */
@@ -2083,6 +2008,8 @@ export type SubaccountsRetrieveResponse = {
2083
2008
  active?: boolean;
2084
2009
  /** Bloqueio: `none`, `receive` (não recebe), `withdraw` (não saca) ou `full` (bloqueio total). Devolver à principal sempre vale. */
2085
2010
  lockMode?: string;
2011
+ /** Bloqueio da WyzeCash: `none`, `receive` (não recebe), `withdraw` (não saca, não transfere, não devolve à principal e não é excluída) ou `full` (os dois). Vale por cima do `lockMode` e só a WyzeCash tira. */
2012
+ platformLock?: string;
2086
2013
  /** Saque travado pelo bloqueio automático do MED. */
2087
2014
  medLocked?: boolean;
2088
2015
  /** O que falta reservar ou pagar do MED, em centavos (sai das próximas entradas da subconta). */
@@ -2246,6 +2173,8 @@ export type SubaccountsUpdateResponse = {
2246
2173
  active: boolean;
2247
2174
  /** Bloqueio: `none`, `receive` (não recebe), `withdraw` (não saca) ou `full` (bloqueio total). Devolver à principal sempre vale. */
2248
2175
  lockMode: string;
2176
+ /** Bloqueio da WyzeCash: `none`, `receive` (não recebe), `withdraw` (não saca, não transfere, não devolve à principal e não é excluída) ou `full` (os dois). Vale por cima do `lockMode` e só a WyzeCash tira. */
2177
+ platformLock: string;
2249
2178
  /** Saque travado pelo bloqueio automático do MED. */
2250
2179
  medLocked: boolean;
2251
2180
  /** O que falta reservar ou pagar do MED, em centavos (sai das próximas entradas da subconta). */
@@ -2386,6 +2315,8 @@ export type SubaccountsUpdateSettingsParams = {
2386
2315
  };
2387
2316
  /** Bloqueio automático por MED: subconta sem saldo livre para o MED fica sem sacar até pagar. */
2388
2317
  medAutoLock?: boolean;
2318
+ /** Repassar a taxa de MED à subconta: a Taxa de MED recebido de um MED numa venda da subconta sai dela (na venda dividida, cada uma paga a parte dela); sem saldo livre, fica pendente e sai das próximas entradas dela. */
2319
+ medFeeToSubaccount?: boolean;
2389
2320
  /** Saque para o titular: `off`, `notify` (avisa quando é outra pessoa) ou `cpf_only` (só a chave CPF/CNPJ do titular). */
2390
2321
  holderWithdrawal?: "off" | "notify" | "cpf_only";
2391
2322
  };
@@ -2951,38 +2882,11 @@ export declare const OPERATIONS: {
2951
2882
  readonly moneyOut: false;
2952
2883
  readonly binary: false;
2953
2884
  };
2954
- readonly baixar_prova_med: {
2955
- readonly method: "GET";
2956
- readonly path: "/v1/meds/{id}/attachments/{attachmentId}";
2957
- readonly query: readonly [];
2958
- readonly body: false;
2959
- readonly idempotent: false;
2960
- readonly moneyOut: false;
2961
- readonly binary: true;
2962
- };
2963
- readonly enviar_pix: {
2885
+ readonly responder_med: {
2964
2886
  readonly method: "POST";
2965
- readonly path: "/v1/pix/payments";
2887
+ readonly path: "/v1/meds/{id}/respond";
2966
2888
  readonly query: readonly [];
2967
2889
  readonly body: true;
2968
- readonly idempotent: true;
2969
- readonly moneyOut: true;
2970
- readonly binary: false;
2971
- };
2972
- readonly listar_pix_enviados: {
2973
- readonly method: "GET";
2974
- readonly path: "/v1/pix/payments";
2975
- readonly query: readonly ["limit", "cursor"];
2976
- readonly body: false;
2977
- readonly idempotent: false;
2978
- readonly moneyOut: false;
2979
- readonly binary: false;
2980
- };
2981
- readonly consultar_pix_enviado: {
2982
- readonly method: "GET";
2983
- readonly path: "/v1/pix/payments/{id}";
2984
- readonly query: readonly [];
2985
- readonly body: false;
2986
2890
  readonly idempotent: false;
2987
2891
  readonly moneyOut: false;
2988
2892
  readonly binary: false;
@@ -3211,6 +3115,8 @@ export declare class PaymentsResource {
3211
3115
  *
3212
3116
  * **Permissão da chave:** `payments:get`.
3213
3117
  *
3118
+ * - Para saber quando é paga, use o webhook `payment.paid` (ou o WebSocket `/v1/ws`), não esta consulta em sequência: cada consulta conta no limite de 100 pedidos por minuto da conta e o excesso volta 429. Consulte uma vez para conferir.
3119
+ *
3214
3120
  * `GET /v1/payments/{id}`
3215
3121
  */
3216
3122
  retrieve(id: string, options?: RequestOptions): Promise<PaymentsRetrieveResponse>;
@@ -3466,56 +3372,19 @@ export declare class MedsResource {
3466
3372
  */
3467
3373
  retrieve(id: string, options?: RequestOptions): Promise<MedsRetrieveResponse>;
3468
3374
  /**
3469
- * Baixar uma prova do MED
3375
+ * Responder MED
3470
3376
  *
3471
- * Baixa uma prova anexada à defesa de um MED (o arquivo, como anexo).
3377
+ * Manda a defesa de um MED aberto (`defense`, de 20 a 4.000 caracteres, explicando a venda e a entrega) com até 5 provas em `evidence` (imagem JPG, PNG ou WEBP ou PDF, em base64 em `contentBase64`, até 5 MB cada). A WyzeCash leva a defesa e as provas ao banco de quem pagou; depois disso o MED segue a situação de sempre.
3472
3378
  *
3473
- * **Permissão da chave:** `meds:evidence`.
3379
+ * **Permissão da chave:** `meds:respond`.
3474
3380
  *
3475
- * `GET /v1/meds/{id}/attachments/{attachmentId}`
3476
- */
3477
- downloadAttachment(id: string, attachmentId: string, options?: RequestOptions): Promise<ArrayBuffer>;
3478
- }
3479
- export declare class PixResource {
3480
- private readonly client;
3481
- constructor(client: Requester);
3482
- /**
3483
- * Enviar Pix
3484
- *
3485
- * Envia um Pix (ENV-) para uma chave (`destination`) ou paga um Pix Copia e Cola (`copyPaste`).
3486
- *
3487
- * **Permissão da chave:** `pix:create`.
3488
- *
3489
- * Pede o cabeçalho `Idempotency-Key`.
3490
- *
3491
- * **Tira dinheiro da conta de verdade.**
3381
+ * - Só com o MED `open` e dentro do prazo (`deadline`): depois, `409 MED_NOT_OPEN` ou `409 MED_DEADLINE_PASSED`. Uma resposta por MED.
3382
+ * - As provas não voltam para baixar: ficam guardadas com a WyzeCash e só vão para o banco de quem pagou.
3383
+ * - O MCP não manda a defesa: só mostra como o seu sistema faz.
3492
3384
  *
3493
- * - A chave com `pix:create` só é criada com o 2FA ligado na conta e o código do app autenticador.
3494
- * - A resposta vem `processing` até concluir; o webhook `pix.sent` (com `receiptUrl`) ou `pix.failed` avisa o resultado.
3495
- *
3496
- * `POST /v1/pix/payments`
3497
- */
3498
- send(params?: PixSendParams, options?: RequestOptions): Promise<PixSendResponse>;
3499
- /**
3500
- * Listar Pix enviados
3501
- *
3502
- * Os Pix enviados (concluído traz o `receiptUrl`).
3503
- *
3504
- * **Permissão da chave:** `pix:list`.
3505
- *
3506
- * `GET /v1/pix/payments`
3385
+ * `POST /v1/meds/{id}/respond`
3507
3386
  */
3508
- list(params?: PixListParams, options?: RequestOptions): ListPromise<PixListResponse, PixListResponse["items"][number]>;
3509
- /**
3510
- * Consultar Pix enviado
3511
- *
3512
- * Um Pix enviado pelo código ENV-.
3513
- *
3514
- * **Permissão da chave:** `pix:get`.
3515
- *
3516
- * `GET /v1/pix/payments/{id}`
3517
- */
3518
- retrieve(id: string, options?: RequestOptions): Promise<PixRetrieveResponse>;
3387
+ respond(id: string, params: MedsRespondParams, options?: RequestOptions): Promise<MedsRespondResponse>;
3519
3388
  }
3520
3389
  export declare class WithdrawalsResource {
3521
3390
  private readonly client;
@@ -3556,6 +3425,8 @@ export declare class WithdrawalsResource {
3556
3425
  *
3557
3426
  * **Permissão da chave:** `withdrawals:get`.
3558
3427
  *
3428
+ * - Para saber quando conclui, use os webhooks `withdrawal.completed` e `withdrawal.failed` (ou o WebSocket `/v1/ws`), não esta consulta em sequência: ela conta no limite de 100 pedidos por minuto da conta.
3429
+ *
3559
3430
  * `GET /v1/withdrawals/{id}`
3560
3431
  */
3561
3432
  retrieve(id: string, options?: RequestOptions): Promise<WithdrawalsRetrieveResponse>;
@@ -3614,7 +3485,7 @@ export declare class SubaccountsResource {
3614
3485
  *
3615
3486
  * - Sem taxa no pedido, a subconta segue a taxa global da Configuração das subcontas (`feeMode: "global"`); com comissão por venda (`saleFeeBps`, `saleFeeFixed`) ou taxa por saque (`withdrawFeeBps`, `withdrawFeeFixed`), fica com a própria (`feeMode: "custom"`). `pixKey` é a chave Pix do cliente para o saque dele.
3616
3487
  * - Os `limits` que não vierem no pedido usam os limites padrão da Configuração das subcontas.
3617
- * - O `name` tem de 2 a 80 caracteres. Use só o nome do cliente: o CPF/CNPJ vai em `document` e o id do seu sistema em `externalId`.
3488
+ * - O `name` é o nome do cliente (com CPF, nome e sobrenome; com CNPJ, a razão social; até 100 caracteres), sem CPF/CNPJ, id ou colchetes: o CPF/CNPJ vai em `document` e o id do seu sistema em `externalId`. Até 30/11/2026 o nome fora da regra ainda passa, com o cabeçalho `Warning`; a partir de 01/12/2026, `422 INVALID_NAME`.
3618
3489
  * - Opcionais: `document` (CPF ou CNPJ do titular, guardado criptografado; volta inteiro ao abrir a subconta e mascarado na lista), `lockMode` (`none`, `receive`, `withdraw` ou `full`) e `limits` (`perWithdrawal`, `daily`, `monthly` em centavos para o saque da subconta; `null` sem limite).
3619
3490
  *
3620
3491
  * `POST /v1/subaccounts`
@@ -3663,7 +3534,7 @@ export declare class SubaccountsResource {
3663
3534
  /**
3664
3535
  * Configuração das subcontas
3665
3536
  *
3666
- * A taxa global (`saleFee`, `withdrawFee`: o que você ganha em cada venda e saque das subcontas com `feeMode` global), os limites padrão das subcontas novas (`limits`), o bloqueio automático por MED (`medAutoLock`), o saque para o titular (`holderWithdrawal`: `off`, `notify` ou `cpf_only`), quantas seguem a global (`subaccounts`) e as tarifas da WyzeCash na conta (`platform`). Centavos e pontos-base.
3537
+ * A taxa global (`saleFee`, `withdrawFee`: o que você ganha em cada venda e saque das subcontas com `feeMode` global), os limites padrão das subcontas novas (`limits`), o bloqueio automático por MED (`medAutoLock`), o repasse da taxa de MED à subconta (`medFeeToSubaccount`), o saque para o titular (`holderWithdrawal`: `off`, `notify` ou `cpf_only`), quantas seguem a global (`subaccounts`) e as tarifas da WyzeCash na conta (`platform`, com a Taxa de MED recebido em `med`). Centavos e pontos-base.
3667
3538
  *
3668
3539
  * **Permissão da chave:** `subaccounts:get`.
3669
3540
  *
@@ -3673,7 +3544,7 @@ export declare class SubaccountsResource {
3673
3544
  /**
3674
3545
  * Mudar a Configuração das subcontas
3675
3546
  *
3676
- * Muda a taxa global (`saleFeeBps`, `saleFeeFixed`, `withdrawFeeBps`, `withdrawFeeFixed`), os limites padrão (`limits`, que não passam dos da conta), o bloqueio automático por MED (`medAutoLock`) e o saque para o titular (`holderWithdrawal`). O que não vier fica como está. Só o dono da conta.
3547
+ * Muda a taxa global (`saleFeeBps`, `saleFeeFixed`, `withdrawFeeBps`, `withdrawFeeFixed`), os limites padrão (`limits`, que não passam dos da conta), o bloqueio automático por MED (`medAutoLock`), o repasse da taxa de MED à subconta (`medFeeToSubaccount`: a Taxa de MED recebido de um MED numa venda da subconta sai dela; sem saldo livre, fica pendente nela) e o saque para o titular (`holderWithdrawal`). O que não vier fica como está. Só o dono da conta.
3677
3548
  *
3678
3549
  * **Permissão da chave:** `subaccounts:update`.
3679
3550
  *
@@ -3696,7 +3567,7 @@ export declare class SubaccountsResource {
3696
3567
  /**
3697
3568
  * Movimentos da subconta
3698
3569
  *
3699
- * Os movimentos SUB- da subconta; filtros `from`/`to` e `kind` (`sale`, `fund`, `transfer`, `withdraw`, `return`, `refund`, `med`).
3570
+ * Os movimentos SUB- da subconta; filtros `from`/`to` e `kind` (`sale`, `fund`, `transfer`, `withdraw`, `return`, `refund`, `med`, `med_fee`, a taxa de MED repassada).
3700
3571
  *
3701
3572
  * **Permissão da chave:** `subaccounts:entries`.
3702
3573
  *
@@ -3777,7 +3648,6 @@ export declare abstract class Resources {
3777
3648
  readonly search: SearchResource;
3778
3649
  readonly receipts: ReceiptsResource;
3779
3650
  readonly meds: MedsResource;
3780
- readonly pix: PixResource;
3781
3651
  readonly withdrawals: WithdrawalsResource;
3782
3652
  readonly refunds: RefundsResource;
3783
3653
  readonly subaccounts: SubaccountsResource;
package/dist/generated.js CHANGED
@@ -26,10 +26,7 @@ export const OPERATIONS = {
26
26
  comprovante: { method: "GET", path: "/v1/receipts/{id}", query: [], body: false, idempotent: false, moneyOut: false, binary: false },
27
27
  listar_meds: { method: "GET", path: "/v1/meds", query: ["limit", "cursor", "status"], body: false, idempotent: false, moneyOut: false, binary: false },
28
28
  consultar_med: { method: "GET", path: "/v1/meds/{id}", query: [], body: false, idempotent: false, moneyOut: false, binary: false },
29
- baixar_prova_med: { method: "GET", path: "/v1/meds/{id}/attachments/{attachmentId}", query: [], body: false, idempotent: false, moneyOut: false, binary: true },
30
- enviar_pix: { method: "POST", path: "/v1/pix/payments", query: [], body: true, idempotent: true, moneyOut: true, binary: false },
31
- listar_pix_enviados: { method: "GET", path: "/v1/pix/payments", query: ["limit", "cursor"], body: false, idempotent: false, moneyOut: false, binary: false },
32
- consultar_pix_enviado: { method: "GET", path: "/v1/pix/payments/{id}", query: [], body: false, idempotent: false, moneyOut: false, binary: false },
29
+ responder_med: { method: "POST", path: "/v1/meds/{id}/respond", query: [], body: true, idempotent: false, moneyOut: false, binary: false },
33
30
  criar_saque: { method: "POST", path: "/v1/withdrawals", query: [], body: true, idempotent: true, moneyOut: true, binary: false },
34
31
  listar_saques: { method: "GET", path: "/v1/withdrawals", query: ["limit", "cursor", "subaccountId"], body: false, idempotent: false, moneyOut: false, binary: false },
35
32
  consultar_saque: { method: "GET", path: "/v1/withdrawals/{id}", query: [], body: false, idempotent: false, moneyOut: false, binary: false },
@@ -109,6 +106,8 @@ export class PaymentsResource {
109
106
  *
110
107
  * **Permissão da chave:** `payments:get`.
111
108
  *
109
+ * - Para saber quando é paga, use o webhook `payment.paid` (ou o WebSocket `/v1/ws`), não esta consulta em sequência: cada consulta conta no limite de 100 pedidos por minuto da conta e o excesso volta 429. Consulte uma vez para conferir.
110
+ *
112
111
  * `GET /v1/payments/{id}`
113
112
  */
114
113
  retrieve(id, options) {
@@ -426,65 +425,20 @@ export class MedsResource {
426
425
  return this.client.request("consultar_med", [id], undefined, options);
427
426
  }
428
427
  /**
429
- * Baixar uma prova do MED
430
- *
431
- * Baixa uma prova anexada à defesa de um MED (o arquivo, como anexo).
432
- *
433
- * **Permissão da chave:** `meds:evidence`.
434
- *
435
- * `GET /v1/meds/{id}/attachments/{attachmentId}`
436
- */
437
- downloadAttachment(id, attachmentId, options) {
438
- return this.client.request("baixar_prova_med", [id, attachmentId], undefined, options);
439
- }
440
- }
441
- export class PixResource {
442
- client;
443
- constructor(client) {
444
- this.client = client;
445
- }
446
- /**
447
- * Enviar Pix
428
+ * Responder MED
448
429
  *
449
- * Envia um Pix (ENV-) para uma chave (`destination`) ou paga um Pix Copia e Cola (`copyPaste`).
430
+ * Manda a defesa de um MED aberto (`defense`, de 20 a 4.000 caracteres, explicando a venda e a entrega) com até 5 provas em `evidence` (imagem JPG, PNG ou WEBP ou PDF, em base64 em `contentBase64`, até 5 MB cada). A WyzeCash leva a defesa e as provas ao banco de quem pagou; depois disso o MED segue a situação de sempre.
450
431
  *
451
- * **Permissão da chave:** `pix:create`.
452
- *
453
- * Pede o cabeçalho `Idempotency-Key`.
454
- *
455
- * **Tira dinheiro da conta de verdade.**
432
+ * **Permissão da chave:** `meds:respond`.
456
433
  *
457
- * - A chave com `pix:create` só é criada com o 2FA ligado na conta e o código do app autenticador.
458
- * - A resposta vem `processing` até concluir; o webhook `pix.sent` (com `receiptUrl`) ou `pix.failed` avisa o resultado.
434
+ * - Só com o MED `open` e dentro do prazo (`deadline`): depois, `409 MED_NOT_OPEN` ou `409 MED_DEADLINE_PASSED`. Uma resposta por MED.
435
+ * - As provas não voltam para baixar: ficam guardadas com a WyzeCash e só vão para o banco de quem pagou.
436
+ * - O MCP não manda a defesa: só mostra como o seu sistema faz.
459
437
  *
460
- * `POST /v1/pix/payments`
438
+ * `POST /v1/meds/{id}/respond`
461
439
  */
462
- send(params, options) {
463
- return this.client.request("enviar_pix", [], params, options);
464
- }
465
- /**
466
- * Listar Pix enviados
467
- *
468
- * Os Pix enviados (concluído traz o `receiptUrl`).
469
- *
470
- * **Permissão da chave:** `pix:list`.
471
- *
472
- * `GET /v1/pix/payments`
473
- */
474
- list(params, options) {
475
- return this.client.list("listar_pix_enviados", [], params, options);
476
- }
477
- /**
478
- * Consultar Pix enviado
479
- *
480
- * Um Pix enviado pelo código ENV-.
481
- *
482
- * **Permissão da chave:** `pix:get`.
483
- *
484
- * `GET /v1/pix/payments/{id}`
485
- */
486
- retrieve(id, options) {
487
- return this.client.request("consultar_pix_enviado", [id], undefined, options);
440
+ respond(id, params, options) {
441
+ return this.client.request("responder_med", [id], params, options);
488
442
  }
489
443
  }
490
444
  export class WithdrawalsResource {
@@ -532,6 +486,8 @@ export class WithdrawalsResource {
532
486
  *
533
487
  * **Permissão da chave:** `withdrawals:get`.
534
488
  *
489
+ * - Para saber quando conclui, use os webhooks `withdrawal.completed` e `withdrawal.failed` (ou o WebSocket `/v1/ws`), não esta consulta em sequência: ela conta no limite de 100 pedidos por minuto da conta.
490
+ *
535
491
  * `GET /v1/withdrawals/{id}`
536
492
  */
537
493
  retrieve(id, options) {
@@ -602,7 +558,7 @@ export class SubaccountsResource {
602
558
  *
603
559
  * - Sem taxa no pedido, a subconta segue a taxa global da Configuração das subcontas (`feeMode: "global"`); com comissão por venda (`saleFeeBps`, `saleFeeFixed`) ou taxa por saque (`withdrawFeeBps`, `withdrawFeeFixed`), fica com a própria (`feeMode: "custom"`). `pixKey` é a chave Pix do cliente para o saque dele.
604
560
  * - Os `limits` que não vierem no pedido usam os limites padrão da Configuração das subcontas.
605
- * - O `name` tem de 2 a 80 caracteres. Use só o nome do cliente: o CPF/CNPJ vai em `document` e o id do seu sistema em `externalId`.
561
+ * - O `name` é o nome do cliente (com CPF, nome e sobrenome; com CNPJ, a razão social; até 100 caracteres), sem CPF/CNPJ, id ou colchetes: o CPF/CNPJ vai em `document` e o id do seu sistema em `externalId`. Até 30/11/2026 o nome fora da regra ainda passa, com o cabeçalho `Warning`; a partir de 01/12/2026, `422 INVALID_NAME`.
606
562
  * - Opcionais: `document` (CPF ou CNPJ do titular, guardado criptografado; volta inteiro ao abrir a subconta e mascarado na lista), `lockMode` (`none`, `receive`, `withdraw` ou `full`) e `limits` (`perWithdrawal`, `daily`, `monthly` em centavos para o saque da subconta; `null` sem limite).
607
563
  *
608
564
  * `POST /v1/subaccounts`
@@ -661,7 +617,7 @@ export class SubaccountsResource {
661
617
  /**
662
618
  * Configuração das subcontas
663
619
  *
664
- * A taxa global (`saleFee`, `withdrawFee`: o que você ganha em cada venda e saque das subcontas com `feeMode` global), os limites padrão das subcontas novas (`limits`), o bloqueio automático por MED (`medAutoLock`), o saque para o titular (`holderWithdrawal`: `off`, `notify` ou `cpf_only`), quantas seguem a global (`subaccounts`) e as tarifas da WyzeCash na conta (`platform`). Centavos e pontos-base.
620
+ * A taxa global (`saleFee`, `withdrawFee`: o que você ganha em cada venda e saque das subcontas com `feeMode` global), os limites padrão das subcontas novas (`limits`), o bloqueio automático por MED (`medAutoLock`), o repasse da taxa de MED à subconta (`medFeeToSubaccount`), o saque para o titular (`holderWithdrawal`: `off`, `notify` ou `cpf_only`), quantas seguem a global (`subaccounts`) e as tarifas da WyzeCash na conta (`platform`, com a Taxa de MED recebido em `med`). Centavos e pontos-base.
665
621
  *
666
622
  * **Permissão da chave:** `subaccounts:get`.
667
623
  *
@@ -673,7 +629,7 @@ export class SubaccountsResource {
673
629
  /**
674
630
  * Mudar a Configuração das subcontas
675
631
  *
676
- * Muda a taxa global (`saleFeeBps`, `saleFeeFixed`, `withdrawFeeBps`, `withdrawFeeFixed`), os limites padrão (`limits`, que não passam dos da conta), o bloqueio automático por MED (`medAutoLock`) e o saque para o titular (`holderWithdrawal`). O que não vier fica como está. Só o dono da conta.
632
+ * Muda a taxa global (`saleFeeBps`, `saleFeeFixed`, `withdrawFeeBps`, `withdrawFeeFixed`), os limites padrão (`limits`, que não passam dos da conta), o bloqueio automático por MED (`medAutoLock`), o repasse da taxa de MED à subconta (`medFeeToSubaccount`: a Taxa de MED recebido de um MED numa venda da subconta sai dela; sem saldo livre, fica pendente nela) e o saque para o titular (`holderWithdrawal`). O que não vier fica como está. Só o dono da conta.
677
633
  *
678
634
  * **Permissão da chave:** `subaccounts:update`.
679
635
  *
@@ -700,7 +656,7 @@ export class SubaccountsResource {
700
656
  /**
701
657
  * Movimentos da subconta
702
658
  *
703
- * Os movimentos SUB- da subconta; filtros `from`/`to` e `kind` (`sale`, `fund`, `transfer`, `withdraw`, `return`, `refund`, `med`).
659
+ * Os movimentos SUB- da subconta; filtros `from`/`to` e `kind` (`sale`, `fund`, `transfer`, `withdraw`, `return`, `refund`, `med`, `med_fee`, a taxa de MED repassada).
704
660
  *
705
661
  * **Permissão da chave:** `subaccounts:entries`.
706
662
  *
@@ -791,7 +747,6 @@ export class Resources {
791
747
  search;
792
748
  receipts;
793
749
  meds;
794
- pix;
795
750
  withdrawals;
796
751
  refunds;
797
752
  subaccounts;
@@ -807,7 +762,6 @@ export class Resources {
807
762
  this.search = new SearchResource(client);
808
763
  this.receipts = new ReceiptsResource(client);
809
764
  this.meds = new MedsResource(client);
810
- this.pix = new PixResource(client);
811
765
  this.withdrawals = new WithdrawalsResource(client);
812
766
  this.refunds = new RefundsResource(client);
813
767
  this.subaccounts = new SubaccountsResource(client);
package/dist/index.d.ts CHANGED
@@ -5,4 +5,4 @@ export * from "./generated.js";
5
5
  export { ListPromise } from "./pagination.js";
6
6
  export { RealtimeConnection, matchesEvent, type RealtimeEvent, type RealtimeOptions, type WebSocketConstructor, type WebSocketLike } from "./realtime.js";
7
7
  export { VERSION } from "./version.js";
8
- export { SIGNATURE_HEADER, WEBHOOK_EVENT_TYPES, signWebhook, verifyWebhook, type VerifyOptions, type WebhookEvent, type WebhookEventType } from "./webhooks.js";
8
+ export { LEGACY_SIGNATURE_HEADER, SIGNATURE_HEADER, WEBHOOK_EVENT_TYPES, signWebhook, verifyWebhook, type VerifyOptions, type WebhookEvent, type WebhookEventType } from "./webhooks.js";
package/dist/index.js CHANGED
@@ -4,4 +4,4 @@ export * from "./generated.js";
4
4
  export { ListPromise } from "./pagination.js";
5
5
  export { RealtimeConnection, matchesEvent } from "./realtime.js";
6
6
  export { VERSION } from "./version.js";
7
- export { SIGNATURE_HEADER, WEBHOOK_EVENT_TYPES, signWebhook, verifyWebhook } from "./webhooks.js";
7
+ export { LEGACY_SIGNATURE_HEADER, SIGNATURE_HEADER, WEBHOOK_EVENT_TYPES, signWebhook, verifyWebhook } from "./webhooks.js";
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "0.1.0";
1
+ export declare const VERSION = "0.3.0";
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const VERSION = "0.1.0";
1
+ export const VERSION = "0.3.0";
@@ -13,7 +13,10 @@ export interface VerifyOptions {
13
13
  /** Agora, em segundos (para testes). */
14
14
  now?: number;
15
15
  }
16
- export declare const SIGNATURE_HEADER = "x-bukio-signature";
16
+ /** O cabeçalho da assinatura (em minúsculas, como o Node entrega). */
17
+ export declare const SIGNATURE_HEADER = "x-wyzecash-signature";
18
+ /** O cabeçalho antigo: vem junto, com o mesmo valor, até 30/11/2026; a partir de 01/12/2026, não vem mais. */
19
+ export declare const LEGACY_SIGNATURE_HEADER = "x-bukio-signature";
17
20
  /**
18
21
  * Confere a assinatura e devolve o evento. Lança `WyzeCashWebhookError` quando o aviso não é da
19
22
  * WyzeCash (assinatura errada, sem assinatura ou fora do prazo).
package/dist/webhooks.js CHANGED
@@ -1,7 +1,8 @@
1
1
  // Conferir a assinatura dos webhooks da WyzeCash. Cada aviso chega com o cabeçalho
2
- // X-Bukio-Signature: t=<unix>,v1=<HMAC-SHA256 em hex de "<t>.<corpo>">
3
- // feito com o segredo do webhook (painel › Integrações e API › Webhooks). Confira sempre com o
4
- // corpo cru, como chegou: o JSON lido e escrito de novo muda os bytes e a assinatura não bate.
2
+ // X-WyzeCash-Signature: t=<unix>,v1=<HMAC-SHA256 em hex de "<t>.<corpo>">
3
+ // feito com o segredo do webhook (painel › Integrações e API › Webhooks). Até 30/11/2026 o antigo
4
+ // X-Bukio-Signature vem junto, com o mesmo valor; a partir de 01/12/2026, só o novo. Confira sempre
5
+ // com o corpo cru, como chegou: o JSON lido e escrito de novo muda os bytes e a assinatura não bate.
5
6
  // Usa o Web Crypto, então funciona no Node 20+, Bun, Deno e servidores na borda.
6
7
  import { WyzeCashWebhookError } from "./errors.js";
7
8
  export const WEBHOOK_EVENT_TYPES = [
@@ -20,7 +21,10 @@ export const WEBHOOK_EVENT_TYPES = [
20
21
  "subaccount.debited",
21
22
  "webhook.test",
22
23
  ];
23
- export const SIGNATURE_HEADER = "x-bukio-signature";
24
+ /** O cabeçalho da assinatura (em minúsculas, como o Node entrega). */
25
+ export const SIGNATURE_HEADER = "x-wyzecash-signature";
26
+ /** O cabeçalho antigo: vem junto, com o mesmo valor, até 30/11/2026; a partir de 01/12/2026, não vem mais. */
27
+ export const LEGACY_SIGNATURE_HEADER = "x-bukio-signature";
24
28
  const encoder = new TextEncoder();
25
29
  function toBytes(body) {
26
30
  if (typeof body === "string")
@@ -49,12 +53,12 @@ export async function verifyWebhook(body, signatureHeader, secret, options = {})
49
53
  if (!secret)
50
54
  throw new Error("Passe o segredo do webhook (painel › Integrações e API › Webhooks).");
51
55
  if (!signatureHeader)
52
- throw new WyzeCashWebhookError("Aviso sem o cabeçalho X-Bukio-Signature.", "MISSING_SIGNATURE");
56
+ throw new WyzeCashWebhookError("Aviso sem o cabeçalho X-WyzeCash-Signature.", "MISSING_SIGNATURE");
53
57
  const parts = signatureHeader.split(",").map((part) => part.trim().split("="));
54
58
  const timestamp = Number(parts.find(([k]) => k === "t")?.[1]);
55
59
  const signatures = parts.filter(([k]) => k === "v1").map(([, v]) => v ?? "");
56
60
  if (!Number.isInteger(timestamp) || !signatures.length)
57
- throw new WyzeCashWebhookError("Cabeçalho X-Bukio-Signature em formato errado.", "INVALID_SIGNATURE");
61
+ throw new WyzeCashWebhookError("Cabeçalho X-WyzeCash-Signature em formato errado.", "INVALID_SIGNATURE");
58
62
  const tolerance = options.tolerance ?? 300;
59
63
  const now = options.now ?? Math.floor(Date.now() / 1000);
60
64
  if (Math.abs(now - timestamp) > tolerance)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wyzecash",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "SDK oficial da WyzeCash para Node.js, Bun e Deno: cobranças por Pix, cartão e cripto, saques, subcontas e webhooks (com plugin para o Fastify).",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "./package.json": "./package.json"
19
19
  },
20
- "files": ["dist", "README.md", "LICENSE"],
20
+ "files": ["dist", "README.md", "CHANGELOG.md", "LICENSE"],
21
21
  "sideEffects": false,
22
22
  "engines": {
23
23
  "node": ">=20"