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 +33 -0
- package/README.md +47 -9
- package/dist/client.d.ts +2 -2
- package/dist/client.js +1 -1
- package/dist/fastify.js +14 -6
- package/dist/generated.d.ts +82 -212
- package/dist/generated.js +18 -64
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/webhooks.d.ts +4 -1
- package/dist/webhooks.js +10 -6
- package/package.json +2 -2
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://
|
|
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 (`
|
|
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`, `
|
|
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-
|
|
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-
|
|
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://
|
|
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://
|
|
6
|
+
export declare const DEFAULT_BASE_URL = "https://api.wyzecash.com.br";
|
|
7
7
|
export interface ClientOptions {
|
|
8
|
-
/** A chave de API (`
|
|
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://
|
|
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)
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
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
|
|
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) {
|
package/dist/generated.d.ts
CHANGED
|
@@ -1362,153 +1362,74 @@ export type MedsRetrieveResponse = {
|
|
|
1362
1362
|
/** Quando foi criado. */
|
|
1363
1363
|
createdAt: string;
|
|
1364
1364
|
};
|
|
1365
|
-
/** Pedido de `
|
|
1366
|
-
export type
|
|
1367
|
-
/**
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
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 `
|
|
1474
|
-
export type
|
|
1374
|
+
/** Resposta de `meds.respond` (Responder MED). */
|
|
1375
|
+
export type MedsRespondResponse = {
|
|
1475
1376
|
/** Código. */
|
|
1476
1377
|
id: string;
|
|
1477
|
-
/**
|
|
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
|
-
/**
|
|
1484
|
-
|
|
1485
|
-
/**
|
|
1486
|
-
|
|
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
|
-
/**
|
|
1490
|
-
|
|
1491
|
-
|
|
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
|
-
/**
|
|
1494
|
-
|
|
1495
|
-
/** Tipo
|
|
1496
|
-
|
|
1497
|
-
/**
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
/**
|
|
1503
|
-
|
|
1504
|
-
/**
|
|
1505
|
-
|
|
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
|
|
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/
|
|
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
|
-
*
|
|
3375
|
+
* Responder MED
|
|
3470
3376
|
*
|
|
3471
|
-
*
|
|
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:
|
|
3379
|
+
* **Permissão da chave:** `meds:respond`.
|
|
3474
3380
|
*
|
|
3475
|
-
* `
|
|
3476
|
-
|
|
3477
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
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`
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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:** `
|
|
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
|
-
* -
|
|
458
|
-
* -
|
|
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/
|
|
438
|
+
* `POST /v1/meds/{id}/respond`
|
|
461
439
|
*/
|
|
462
|
-
|
|
463
|
-
return this.client.request("
|
|
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`
|
|
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
|
+
export declare const VERSION = "0.3.0";
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const VERSION = "0.
|
|
1
|
+
export const VERSION = "0.3.0";
|
package/dist/webhooks.d.ts
CHANGED
|
@@ -13,7 +13,10 @@ export interface VerifyOptions {
|
|
|
13
13
|
/** Agora, em segundos (para testes). */
|
|
14
14
|
now?: number;
|
|
15
15
|
}
|
|
16
|
-
|
|
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-
|
|
3
|
-
// feito com o segredo do webhook (painel › Integrações e API › Webhooks).
|
|
4
|
-
//
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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.
|
|
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"
|