Download OpenAPI specification:Download
A Woovi é uma Plataforma de Gestão de Pagamentos.
Para utilizar nossa API de Produção, utilize exclusivamente o seguinte endpoint:
Além disso, oferecemos também um ambiente de sandbox (ambiente de testes), ideal para desenvolvimento e validação de integrações sem impactar dados reais.
👉 https://api.woovi-sandbox.com/
Veja como configurar seu acesso a nossa API aqui.
Closes an Account.
Notes:
| accountId required | string Example: 6290ccfd42831958a405debc ID of the Account |
const http = require('https'); const options = { method: 'DELETE', hostname: 'api.woovi.com', port: null, path: '/api/v1/account/6290ccfd42831958a405debc', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "status": "OK",
- "accountId": "6290ccfd42831958a405debc"
}| accountId required | string Example: 6290ccfd42831958a405debc ID of the Account |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/account/6290ccfd42831958a405debc', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "account": {
- "accountId": "6290ccfd42831958a405debc",
- "isDefault": true,
- "balance": {
- "total": 129430,
- "blocked": 0,
- "available": 129430,
- "blockedBySecurity": 0,
- "blockedByWithdrawSafety": 0
}, - "taxId": "12345678901",
- "officialName": "Company Name LLC",
- "tradeName": "Company Trade Name",
- "branch": "0001",
- "account": "123456",
- "accountName": "Main Account"
}
}| skip | number Number of items to skip for pagination |
| limit | number Example: limit=10 Maximum number of items to return |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/account?email=email0%40example.com&skip=0&limit=10', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "pageInfo": {
- "skip": 0,
- "limit": 10,
- "hasPreviousPage": false,
- "hasNextPage": true
}, - "accounts": [
- {
- "accountId": "6290ccfd42831958a405debc",
- "isDefault": true,
- "balance": {
- "total": 129430,
- "blocked": 0,
- "available": 129430
}
}, - {
- "accountId": "6286b467a7910113577e00ce",
- "isDefault": false,
- "balance": {
- "total": 130,
- "blocked": 100,
- "available": 30
}
}
]
}Duplicates the account associated with the authorization appId. Requires the bank account feature to be enabled.
const http = require('https'); const options = { method: 'POST', hostname: 'api.woovi.com', port: null, path: '/api/v1/account', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "account": {
- "accountId": "6290ccfd42831958a405debc",
- "isDefault": true,
- "balance": {
- "total": 129430,
- "blocked": 0,
- "available": 129430
}
}
}An additional fee may be charged depending on the minimum free withdrawal amount. See more about at https://developers.openpix.com.br/docs/FAQ/faq-virtual-account/#onde-posso-consultar-as-taxas-da-minha-conta-virtual
| accountId required | string Example: 6290ccfd42831958a405debc ID of the Account |
| value | number Value in cents |
{- "value": 7000
}{- "withdraw": {
- "account": {
- "accountId": "6290ccfd42831958a405debc",
- "isDefault": true,
- "balance": {
- "total": 122430,
- "blocked": 0,
- "available": 122430
}
}, - "transaction": {
- "endToEndId": "E23114447202205191817cx6VMrbwtw6",
- "transaction": 7000
}
}
}Deletes an account registration that is in PENDING status
| id required | string non-empty CorrelationID of the account register to delete |
{- "message": "Account register successfully deleted",
- "accountRegisterId": "12345678901234"
}Retrieves an existing account registration by CorrelationID
| id required | string Example: 6fe18d8e-5009-4f57-8f1d-5b084b6b83ac CorrelationID of the account register |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/account-register/6fe18d8e-5009-4f57-8f1d-5b084b6b83ac', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "officialName": "Company Official Name",
- "tradeName": "Company Trade Name",
- "type": "BAAS",
- "taxID": {
- "taxID": "12345678901234",
- "type": "BR_CNPJ"
}, - "status": "PENDING",
- "correlationID": "6fe18d8e-5009-4f57-8f1d-5b084b6b83ac"
}Endpoints to integrate the Anticipation product: register beneficiaries and sync their advanceable balances from an ERP/payroll.
Approves a PENDING request and triggers the Pix Out to the beneficiary. Idempotent: re-approving an already-approved request returns 200 with the current state; a rejected/terminal one returns 409. Requires the anticipation.request.approve scope.
| id required | string Anticipation request id. |
{- "anticipation": {
- "id": "6290ccfd42831958a405debc",
- "status": "PROCESSING",
- "beneficiaryTaxID": "12345678909",
- "requestedAmount": 100000,
- "feeAmount": 7000,
- "netAmount": 93000,
- "feeMode": "PERCENTAGE",
- "monthlyFeePercentage": 7,
- "daysUntilDue": 7,
- "dueDate": "2026-07-25T03:00:00.000Z",
- "approvedAt": "2026-07-18T12:00:00.000Z",
- "cancelledAt": null,
- "cancelReason": null,
- "endToEndId": null,
- "failureCode": null,
- "failureReason": null,
- "createdAt": "2026-07-18T11:59:00.000Z"
}
}Absolute set of availableAmount/maxAdvanceableAmount for up to 1000 beneficiaries in one call (nightly payroll sync). Returns a per-item report so partial failures can be reconciled.
required | Array of objects [ 1 .. 1000 ] items | ||||||
Array ([ 1 .. 1000 ] items)
| |||||||
{- "items": [
- {
- "taxID": "12345678909",
- "availableAmount": 500000,
- "maxAdvanceableAmount": 350000
}, - {
- "taxID": "98765432100",
- "availableAmount": 120000,
- "maxAdvanceableAmount": 120000
}
]
}{- "processed": 0,
- "succeeded": 0,
- "failed": 0,
- "results": [
- {
- "taxID": "string",
- "ok": true,
- "error": "string"
}
]
}Reactivates a beneficiary previously deactivated.
| taxID required | string Payout key (CPF or CNPJ), with or without mask. |
{- "beneficiary": {
- "name": "string",
- "taxID": {
- "taxID": "string",
- "type": "BR:CPF"
}, - "isActive": true,
- "availableAmount": 0,
- "maxAdvanceableAmount": 0,
- "notifyEmail": "string",
- "notifyPhone": "string",
- "verified": true,
- "createdAt": "2019-08-24T14:15:22Z"
}
}Deactivates a beneficiary; blocks new anticipations and app login.
| taxID required | string Payout key (CPF or CNPJ), with or without mask. |
{- "beneficiary": {
- "name": "string",
- "taxID": {
- "taxID": "string",
- "type": "BR:CPF"
}, - "isActive": true,
- "availableAmount": 0,
- "maxAdvanceableAmount": 0,
- "notifyEmail": "string",
- "notifyPhone": "string",
- "verified": true,
- "createdAt": "2019-08-24T14:15:22Z"
}
}Registers a beneficiary bound to the company resolved from the app_id. Idempotent on the payout key: send ?return_existing=true to get the existing beneficiary (200) instead of a 409.
| return_existing | boolean When |
| name required | string [ 2 .. 120 ] characters Beneficiary name. |
| taxID required | string Payout key (CPF or CNPJ), with or without mask. |
| cpf | string or null The person's CPF. Required when taxID is a CNPJ. |
| notifyEmail | string or null <email> Email used for notifications. |
| notifyPhone | string or null Phone used for notifications. |
| availableAmount | integer or null >= 0 Available balance, in cents. |
| maxAdvanceableAmount | integer or null >= 0 Advanceable limit, in cents. |
| autoApprove | boolean or null Per-beneficiary override of the company auto-approval. |
| feeDestinationAccountId | string or null Fee destination account (overrides the company setting). |
| paymentDaysOverride | Array of integers or null[ items [ 1 .. 31 ] ] Per-beneficiary payment days (1-31). |
object or null Per-beneficiary rolling frequency window. | |
| correlationID | string or null Your correlation ID, echoed back in the response. |
{- "name": "João da Silva",
- "taxID": "12345678909",
- "notifyPhone": "+5511999999999",
- "availableAmount": 500000,
- "maxAdvanceableAmount": 350000,
- "correlationID": "erp-benef-42"
}{- "beneficiary": {
- "name": "string",
- "taxID": {
- "taxID": "string",
- "type": "BR:CPF"
}, - "isActive": true,
- "availableAmount": 0,
- "maxAdvanceableAmount": 0,
- "notifyEmail": "string",
- "notifyPhone": "string",
- "verified": true,
- "createdAt": "2019-08-24T14:15:22Z"
}, - "correlationID": "string"
}Lists the company's anticipation requests. Poll ?status=PENDING to discover requests awaiting your approval before settlement. Requires the anticipation.request.read scope.
| status | string Enum: "PENDING" "PROCESSING" "CONFIRMED" "CANCELED" "PAID" "OVERDUE" "FAILED" Filter by status. |
| limit | integer Max items to return (default 100, capped at 1000). |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/anticipation?status=SOME_STRING_VALUE&limit=SOME_INTEGER_VALUE', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "anticipations": [
- {
- "id": "6290ccfd42831958a405debc",
- "status": "PENDING",
- "beneficiaryTaxID": "12345678909",
- "requestedAmount": 100000,
- "feeAmount": 7000,
- "netAmount": 93000,
- "feeMode": "PERCENTAGE",
- "monthlyFeePercentage": 7,
- "daysUntilDue": 7,
- "dueDate": "2026-07-25T03:00:00.000Z",
- "approvedAt": null,
- "cancelledAt": null,
- "cancelReason": null,
- "endToEndId": null,
- "failureCode": null,
- "failureReason": null,
- "createdAt": "2026-07-18T11:59:00.000Z"
}
], - "count": 1
}Rejects a PENDING request (releases the reserved cycle limit). Idempotent: re-rejecting a canceled request returns 200; an approved/terminal one returns 409. Requires the anticipation.request.approve scope.
| id required | string Anticipation request id. |
| reason | string Optional rejection reason (audited). |
{- "reason": "string"
}{- "anticipation": {
- "id": "6290ccfd42831958a405debc",
- "status": "CANCELED",
- "beneficiaryTaxID": "12345678909",
- "requestedAmount": 100000,
- "feeAmount": 7000,
- "netAmount": 93000,
- "feeMode": "PERCENTAGE",
- "monthlyFeePercentage": 7,
- "daysUntilDue": 7,
- "dueDate": "2026-07-25T03:00:00.000Z",
- "approvedAt": null,
- "cancelledAt": "2026-07-18T12:05:00.000Z",
- "cancelReason": "acima do limite",
- "endToEndId": null,
- "failureCode": null,
- "failureReason": null,
- "createdAt": "2026-07-18T11:59:00.000Z"
}
}Deactivates an application by setting isActive to false and adding a removedAt timestamp
const http = require('https'); const options = { method: 'DELETE', hostname: 'api.woovi.com', port: null, path: '/api/v1/application', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "success": true
}Creates a new application for a company. If the company has the APPLICATION_SCOPES_REQUIRED feature enabled, the scopes field is required.
Data to create a new application
| accountId | string The ID of the company bank account |
object |
{- "accountId": "507f1f77bcf86cd799439011",
- "application": {
- "name": "Test API",
- "type": "API"
}
}{- "application": {
- "name": "Test API with Scopes",
- "isActive": true,
- "type": "API",
- "clientId": "client_123abc",
- "clientSecret": "secret_456def",
- "appID": "app_789ghi",
- "scopes": [
- "CHARGE_POST",
- "CHARGE_GET"
]
}
}Endpoints to validate and pay boletos (Boleto OUT).
The Boleto OUT flow has three steps:
POST /api/v1/boleto/validate) to confirm the amount, due date and beneficiary.POST /api/v1/payment) with type: "BOLETO" and the boletoBarcode.POST /api/v1/payment/approve), unless it was created with autoApprove: true.Requires the BOLETO_VALIDATE_POST scope on the application.
Lists the boleto transactions of your company, most recent first, so you can reconcile boleto receivables and payments against your own records.
A transaction is either a BOLETO_IN — a boleto your payer paid — or a
BOLETO_OUT — a boleto your company paid. All monetary values are in cents.
value is the amount that actually moved, which for a boleto paid after the
due date is above the emitted amount in charge.value because of interest
and fine. finesValue and interestsValue split that difference, as charged
by the bank, so you can reconcile an overdue boleto without recomputing it
from the charge settings. Each is absent when there was none, so a boleto
paid on time carries neither.
Two independent date ranges are offered because they answer different
questions: start/end filter by when the transaction was created, and
settledStart/settledEnd by when Woovi credited the amount to your
account. Both dates come back on every item.
Requires the BOLETO_TRANSACTION_GET_LIST scope on the application.
| type | string Enum: "BOLETO_IN" "BOLETO_OUT" Only transactions of this type. |
| status | string Enum: "CREATED" "PROCESSING" "PENDING" "CONFIRMED" "REJECTED" Only transactions in this status. |
| start | string <date-time> Example: start=2026-07-01T00:00:00.000Z Only transactions created from this date on. |
| end | string <date-time> Only transactions created up to this date. |
| settledStart | string <date-time> Only transactions settled from this date on. |
| settledEnd | string <date-time> Only transactions settled up to this date. |
| skip | integer <= 10000 Default: 0 Rows to skip. Capped at 10000 — past that, narrow the window with the date filters instead of paginating deeper. |
| limit | integer <= 100 Default: 100 Rows to return. |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/boleto-transaction?type=SOME_STRING_VALUE&status=SOME_STRING_VALUE&start=2026-07-01T00%3A00%3A00.000Z&end=SOME_STRING_VALUE&settledStart=SOME_STRING_VALUE&settledEnd=SOME_STRING_VALUE&skip=SOME_INTEGER_VALUE&limit=SOME_INTEGER_VALUE', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "status": "OK",
- "pageInfo": {
- "skip": 0,
- "limit": 100,
- "hasPreviousPage": false,
- "hasNextPage": false
}, - "boletoTransactions": [
- {
- "boletoTransactionID": "btx_019fa55beec9775faf8a069d64dcde54",
- "type": "BOLETO_IN",
- "status": "CONFIRMED",
- "value": 245000,
- "fee": 299,
- "createdAt": "2026-07-26T13:04:11.212Z",
- "settledAt": "2026-07-27T10:00:00.000Z",
- "finesValue": 1902,
- "interestsValue": 200,
- "charge": {
- "value": 242898,
- "status": "COMPLETED",
- "boletoBarcode": "34191120100002428981103069645110772982609000",
- "boletoDigitable": "34191103036964511077129826090002112010000242898"
}
}, - {
- "boletoTransactionID": "btx_019fa4e1b3227a1c9f0e5d3a71b8c204",
- "type": "BOLETO_OUT",
- "status": "CONFIRMED",
- "value": 50000,
- "fee": 150,
- "createdAt": "2026-07-25T09:12:44.001Z"
}
]
}Returns one boleto transaction of your company.
The id is the boletoTransactionID delivered in the BOLETO_SETTLED
webhook, so you can confirm a settlement you were notified about.
Requires the BOLETO_TRANSACTION_GET scope on the application.
| boletoTransactionID required | string Example: btx_019fa55beec9775faf8a069d64dcde54 The boleto transaction id, as delivered in the webhook. |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/boleto-transaction/btx_019fa55beec9775faf8a069d64dcde54', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "boletoTransaction": {
- "boletoTransactionID": "btx_019fa55beec9775faf8a069d64dcde54",
- "type": "BOLETO_IN",
- "status": "CREATED",
- "value": 245000,
- "fee": 299,
- "createdAt": "2019-08-24T14:15:22Z",
- "settledAt": "2019-08-24T14:15:22Z",
- "finesValue": 1902,
- "interestsValue": 200,
- "discountValue": 500,
- "charge": {
- "value": 242898,
- "status": "COMPLETED",
- "boletoBarcode": "string",
- "boletoDigitable": "string"
}
}
}Validates a boleto by its barcode before paying it. This is step 1 of the Boleto OUT flow: it confirms the amount, due date and beneficiary so you can review the boleto before creating the payment.
The barcode must have 44, 47 or 48 digits. All monetary values are returned in cents.
Requires the BOLETO_VALIDATE_POST scope on the application.
After validating, create the payment with POST /api/v1/payment using
type: "BOLETO" and the boletoBarcode.
| barcode required | string The boleto barcode. Must have 44, 47 or 48 digits. |
{- "barcode": "34195148200000003001095517077320772982609000"
}{- "boleto": {
- "barcode": "34195148200000003001095517077320772982609000",
- "expiresDate": "2026-06-27T02:59:59.999Z",
- "totalValue": 300,
- "issuingEntity": {
- "code": "341",
- "name": "ITAU UNIBANCO S/A"
}, - "finalBeneficiary": {
- "name": "WOOVI",
- "taxID": "44720743000101"
}
}
}| taxID required | string Examples:
The raw tax ID from the customer you want to get the balance. |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/cashback-fidelity/balance/60151449000182', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "balance": 0,
- "status": "string"
}Create a new cashback exclusive for the customer with a given taxID. If the customer already has a pending excluisve cashback, this endpoint will return it instead.
Customer's taxID and the cash
| taxID | string Customer taxID (CPF or CNPJ) |
| value | number Cashback value in centavos |
{- "value": 100,
- "taxID": 11111111111
}{- "cashback": {
- "value": 0
}, - "message": "string"
}| id required | string Examples:
charge link payment ID |
| size | string Examples:
Size for the image. This size should be between 600 and 4096. if the size parameter was not passed, the default value will be 1024. |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/openpix/charge/brcode/image/fe7834b4060c488a9b0f89811be5f5cf.png?size=768', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "error": "string"
}| id required | string Examples:
charge ID, payment link ID, or QR code ID |
| size | string Examples:
Size for the image. This size should be between 600 and 4096. If the size parameter is not passed, the default value will be 1024. |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/image/qrcode/base64/fe7834b4060c488a9b0f89811be5f5cf?size=768', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "success": true,
- "imageBase64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."
}| id required | string Examples:
charge ID or correlation ID. You will need URI encoding if your correlation ID has characters outside the ASCII set or reserved characters (%, #, /). |
const http = require('https'); const options = { method: 'DELETE', hostname: 'api.woovi.com', port: null, path: '/api/v1/charge/Q2hhcmdlOjYwM2U3NDlhNDI1NjAyYmJiZjRlN2JlZA==', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "status": "OK",
- "id": "fe7834b4060c488a9b0f89811be5f5cf"
}| id required | string Examples:
correlation ID. You will need URI encoding if your correlation ID has characters outside the ASCII set or reserved characters (%, #, /). |
Expires date to update charge
| expiresDate | string Expiration date of the charge. Only in ISO 8601 format. |
{- "expiresDate": "2021-04-01T17:28:51.882Z"
}{- "charge": {
- "status": "ACTIVE",
- "customer": {
- "name": "Dan",
- "phone": "5511999999999",
- "taxID": {
- "taxID": "31324227036",
- "type": "BR:CPF"
}
}, - "value": 100,
- "comment": "good",
- "correlationID": "9134e286-6f71-427a-bf00-241681624586",
- "paymentLinkID": "7777a23s-6f71-427a-bf00-241681624586",
- "expiresIn": 2592000,
- "expiresDate": "2021-04-01T17:28:51.882Z",
- "createdAt": "2021-03-02T17:28:51.882Z",
- "updatedAt": "2021-03-02T17:28:51.882Z",
- "brCode": "000201010212261060014br.gov.bcb.pix2584https://api.woovi.com/openpix/testing?transactionID=867ba5173c734202ac659721306b38c952040000530398654040.015802BR5909LOCALHOST6009Sao Paulo62360532867ba5173c734202ac659721306b38c963044BCA",
- "additionalInfo": [
- {
- "key": "Product",
- "value": "Pencil"
}, - {
- "key": "Invoice",
- "value": "18476"
}, - {
- "key": "Order",
- "value": "302"
}
], - "paymentMethods": {
- "pix": {
- "method": "PIX_COB",
- "transactionID": "9134e286-6f71-427a-bf00-241681624586",
- "identifier": "9134e286-6f71-427a-bf00-241681624586",
- "additionalInfo": [ ],
- "fee": 50,
- "value": 200,
- "status": "ACTIVE",
- "txId": "9134e286-6f71-427a-bf00-241681624586",
- "brCode": "000201010212261060014br.gov.bcb.pix2584https://api.woovi.com/openpix/testing?transactionID=867ba5173c734202ac659721306b38c952040000530398654040.015802BR5909LOCALHOST6009Sao Paulo62360532867ba5173c734202ac659721306b38c963044BCA",
}
}
}
}| id required | string Example: fe7834b4060c488a9b0f89811be5f5cf charge ID or correlation ID. You will need URI encoding if your correlation ID has characters outside the ASCII set or reserved characters (%, #, /). |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/charge/fe7834b4060c488a9b0f89811be5f5cf', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "charge": {
- "status": "ACTIVE",
- "customer": {
- "name": "Dan",
- "phone": "5511999999999",
- "taxID": {
- "taxID": "31324227036",
- "type": "BR:CPF"
}
}, - "value": 100,
- "comment": "good",
- "correlationID": "9134e286-6f71-427a-bf00-241681624586",
- "paymentLinkID": "7777-6f71-427a-bf00-241681624586",
- "globalID": "Q2hhcmdlOjcxOTFmMWIwMjA0NmJmNWY1M2RjZmEwYg==",
- "brCode": "000201010212261060014br.gov.bcb.pix2584https://api.woovi.com/openpix/testing?transactionID=867ba5173c734202ac659721306b38c952040000530398654040.015802BR5909LOCALHOST6009Sao Paulo62360532867ba5173c734202ac659721306b38c963044BCA",
- "additionalInfo": [
- {
- "key": "Product",
- "value": "Pencil"
}, - {
- "key": "Invoice",
- "value": "18476"
}, - {
- "key": "Order",
- "value": "302"
}
], - "expiresIn": 2592000,
- "expiresDate": "2021-04-01T17:28:51.882Z",
- "dueDate": "2021-04-01T17:28:51.882Z",
- "createdAt": "2021-03-02T17:28:51.882Z",
- "updatedAt": "2021-03-02T17:28:51.882Z",
- "paymentMethods": {
- "pix": {
- "method": "PIX_COB",
- "transactionID": "9134e286-6f71-427a-bf00-241681624586",
- "identifier": "9134e286-6f71-427a-bf00-241681624586",
- "additionalInfo": [ ],
- "fee": 50,
- "value": 200,
- "status": "ACTIVE",
- "txId": "9134e286-6f71-427a-bf00-241681624586",
- "brCode": "000201010212261060014br.gov.bcb.pix2584https://api.woovi.com/openpix/testing?transactionID=867ba5173c734202ac659721306b38c952040000530398654040.015802BR5909LOCALHOST6009Sao Paulo62360532867ba5173c734202ac659721306b38c963044BCA",
}
}
}
}| start | string <date-time> (Start Date) Example: start=2020-01-01T00:00:00Z Start date used in the query. Complies with RFC 3339. |
| end | string <date-time> (End Date) Example: end=2020-12-01T17:00:00Z End date used in the query. Complies with RFC 3339. |
| status | string Enum: "ACTIVE" "COMPLETED" "EXPIRED" |
| customer | string Customer Correlation ID |
| subscription | string Subscription Correlation ID |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/charge?start=2020-01-01T00%3A00%3A00Z&end=2020-12-01T17%3A00%3A00Z&status=SOME_STRING_VALUE&customer=SOME_STRING_VALUE&subscription=SOME_STRING_VALUE', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "pageInfo": {
- "skip": 0,
- "limit": 10,
- "hasPreviousPage": false,
- "hasNextPage": true
}, - "charges": {
- "status": "ACTIVE",
- "customer": {
- "name": "Dan",
- "phone": "5511999999999",
- "taxID": {
- "taxID": "31324227036",
- "type": "BR:CPF"
}
}, - "value": 100,
- "comment": "good",
- "correlationID": "9134e286-6f71-427a-bf00-241681624586",
- "paymentLinkID": "7777a23s-6f71-427a-bf00-241681624586",
- "brCode": "000201010212261060014br.gov.bcb.pix2584https://api.woovi.com/openpix/testing?transactionID=867ba5173c734202ac659721306b38c952040000530398654040.015802BR5909LOCALHOST6009Sao Paulo62360532867ba5173c734202ac659721306b38c963044BCA",
- "additionalInfo": [
- {
- "key": "Product",
- "value": "Pencil"
}, - {
- "key": "Invoice",
- "value": "18476"
}, - {
- "key": "Order",
- "value": "302"
}
], - "expiresIn": 2592000,
- "expiresDate": "2021-04-01T17:28:51.882Z",
- "createdAt": "2021-03-02T17:28:51.882Z",
- "updatedAt": "2021-03-02T17:28:51.882Z",
- "paymentMethods": {
- "pix": {
- "method": "PIX_COB",
- "transactionID": "9134e286-6f71-427a-bf00-241681624586",
- "identifier": "9134e286-6f71-427a-bf00-241681624586",
- "additionalInfo": [ ],
- "fee": 50,
- "value": 200,
- "status": "ACTIVE",
- "txId": "9134e286-6f71-427a-bf00-241681624586",
- "brCode": "000201010212261060014br.gov.bcb.pix2584https://api.woovi.com/openpix/testing?transactionID=867ba5173c734202ac659721306b38c952040000530398654040.015802BR5909LOCALHOST6009Sao Paulo62360532867ba5173c734202ac659721306b38c963044BCA",
}
}
}
}Endpoint to create a new Charge for a customer.
You can split the value of a charge across other accounts by sending the
splits array in the request body. Each item accepts:
value: amount in cents that will be split to the destination.pixKey: Pix key of the account that will receive this split.splitType: how the split is processed — one of SPLIT_INTERNAL_TRANSFER,
SPLIT_SUB_ACCOUNT or SPLIT_PARTNER.
See how each split type is processed.See the Charge with Split Internal Transfer and Charge with Split Subaccounts request body examples below for the full payload shape.
| return_existing | boolean Examples:
Make the endpoint idempotent, will return an existent charge if already has a one with the correlationID |
Data to create a new charge
| correlationID required | string Your correlation ID to keep track of this charge |
| value required | number Value in cents of this charge |
| type | string Enum: "DYNAMIC" "OVERDUE" "BOLETO" Charge type is used to determine whether a charge will have a deadline, fines and interests |
| comment | string Comment to be added in infoPagador |
| expiresIn | number Expires the charge in seconds (minimum is 5 minutes) |
| expiresDate | string Expiration date of the charge. Only in ISO 8601 format. |
| dueDate | string Due date for OVERDUE, BOLETO, or subscription charges in ISO 8601 format. |
object or object or object (CustomerPayload) | |
| ensureSameTaxID | boolean true to ensure that the payer taxID must be the same as the customer taxID. |
| fixedLocation | boolean true to fix the qrcode of the charge, same qrcode to all future charges. |
| paymentLinkID | string Payment Link ID, used to link charges to the same qrCode. |
| daysForDueDate | number Time in days until the charge hits the deadline so fines and interests start applying. This property is only considered for charges of type OVERDUE |
| daysAfterDueDate | number Time in days that a charge is still payable after the deadline. This property is only considered for charges of type OVERDUE |
object Interests configuration. This property is only considered for charges of type OVERDUE | |
object Fines configuration. This property is only considered for charges of type OVERDUE | |
object Discount settings for the charge. This property is only considered for charges of type OVERDUE. How it interacts with Modality enum follows the BACEN COBV (Cobrança com Vencimento) spec — see bacen.github.io/pix-api for the upstream reference. Shape of the object depends on
Rounding. Computed discount and interest amounts are rounded to the nearest cent. | |
Array of objects Additional info of the charge | |
| enableCashbackPercentage | boolean true to enable cashback and false to disable. |
| enableCashbackExclusivePercentage | boolean true to enable fidelity cashback and false to disable. |
| subaccount | string Pix key of the subaccount to receive the charge |
Array of objects This is the array that will configure how will be splitted the value of the charge |
{- "correlationID": "9134e286-6f71-427a-bf00-241681624587",
- "value": 100,
- "comment": "good",
- "customer": {
- "name": "Dan",
- "taxID": "31324227036",
- "phone": "5511999999999"
}, - "additionalInfo": [
- {
- "key": "Product",
- "value": "Pencil"
}, - {
- "key": "Invoice",
- "value": "18476"
}, - {
- "key": "Order",
- "value": "302"
}
]
}{- "charge": {
- "status": "ACTIVE",
- "customer": {
- "name": "Dan",
- "phone": "5511999999999",
- "taxID": {
- "taxID": "31324227036",
- "type": "BR:CPF"
}
}, - "value": 100,
- "comment": "good",
- "correlationID": "9134e286-6f71-427a-bf00-241681624586",
- "paymentLinkID": "7777a23s-6f71-427a-bf00-241681624586",
- "expiresIn": 2592000,
- "expiresDate": "2021-09-01T17:28:51.882Z",
- "dueDate": "2021-04-01T17:28:51.882Z",
- "createdAt": "2021-03-02T17:28:51.882Z",
- "updatedAt": "2021-03-02T17:28:51.882Z",
- "brCode": "000201010212261060014br.gov.bcb.pix2584https://api.woovi.com/openpix/testing?transactionID=867ba5173c734202ac659721306b38c952040000530398654040.015802BR5909LOCALHOST6009Sao Paulo62360532867ba5173c734202ac659721306b38c963044BCA",
- "additionalInfo": [
- {
- "key": "Product",
- "value": "Pencil"
}, - {
- "key": "Invoice",
- "value": "18476"
}, - {
- "key": "Order",
- "value": "302"
}
], - "paymentMethods": {
- "pix": {
- "method": "PIX_COB",
- "transactionID": "9134e286-6f71-427a-bf00-241681624586",
- "identifier": "9134e286-6f71-427a-bf00-241681624586",
- "additionalInfo": [ ],
- "fee": 50,
- "value": 200,
- "status": "ACTIVE",
- "txId": "9134e286-6f71-427a-bf00-241681624586",
- "brCode": "000201010212261060014br.gov.bcb.pix2584https://api.woovi.com/openpix/testing?transactionID=867ba5173c734202ac659721306b38c952040000530398654040.015802BR5909LOCALHOST6009Sao Paulo62360532867ba5173c734202ac659721306b38c963044BCA",
}
}
}
}Endpoint to get all refunds of a charge
| id required | string Examples:
The correlation ID of the charge. You will need URI encoding if your correlation ID has characters outside the ASCII set or reserved characters (%, #, /). |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/charge/cf4012c9-b2ac-484d-8121-deedd1c6d8af/refund', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "refunds": [
- {
- "status": "IN_PROCESSING",
- "value": 10,
- "correlationID": "9134e286-6f71-427a-bf00-241681624586",
- "endToEndId": "E23114447202304181826HJNwY577YDX",
- "time": "2021-03-02T17:28:51.882Z"
}, - {
- "status": "CONFIRMED",
- "value": 40,
- "correlationID": "589a378e-ab45-4f30-bd4d-4496c60f88cf",
- "endToEndId": "E23114447202304181057pOhPMsp2pJZ",
- "time": "2021-03-05T14:49:02.922Z",
- "comment": "Comentário do reembolso"
}
]
}Endpoint to create a new refund for a charge
| id required | string Examples:
The correlation ID of the charge. You will need URI encoding if your correlation ID has characters outside the ASCII set or reserved characters (%, #, /). |
Data to create a new refund for a charge
| correlationID required | string Your correlation ID to keep track for this refund |
| value | number Value in cents for this refund |
| comment | string <= 140 Comment for this refund. Maximum length of 140 characters. |
{- "correlationID": "a273e72c-9547-4c75-a213-3b0a2735b8d5",
- "value": 100,
- "comment": "Comentário do reembolso"
}{- "refund": {
- "status": "IN_PROCESSING",
- "value": 100,
- "correlationID": "a273e72c-9547-4c75-a213-3b0a2735b8d5",
- "endToEndId": "E23114447202304181826HJNwY577YDX",
- "time": "2023-03-02T17:28:51.882Z",
- "comment": "Comentário do reembolso"
}
}const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/company', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "company": {
- "officialName": "Company Official Name",
- "tradeName": "Company Trade Name",
- "taxID": "12345678901234",
- "correlationID": "corr-123456"
}
}| id required | string Examples:
Correlation ID or Tax ID |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/customer/fe7834b4060c488a9b0f89811be5f5cf', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "customer": {
- "name": "Dan",
- "phone": "5511999999999",
- "taxID": {
- "taxID": "31324227036",
- "type": "BR:CPF"
}, - "correlationID": "fe7834b4060c488a9b0f89811be5f5cf"
}
}Endpoint to update a Customer
| id required | string Examples:
correlation ID |
Data to update a existent customer
| name | string |
string | |
| phone | string |
| taxID | string |
object |
{- "name": "Dan",
- "phone": "5511999999999",
- "address": {
- "zipcode": "30421322",
- "street": "Street",
- "number": "100",
- "neighborhood": "Neighborhood",
- "city": "Belo Horizonte",
- "state": "MG",
- "complement": "APTO",
- "country": "BR"
}
}{- "customer": {
- "name": "Dan",
- "phone": "5511999999999",
- "taxID": {
- "taxID": "31324227036",
- "type": "BR:CPF"
}, - "address": {
- "zipcode": "30421322",
- "street": "Street",
- "number": "100",
- "neighborhood": "Neighborhood",
- "city": "Belo Horizonte",
- "state": "MG",
- "complement": "APTO",
- "country": "BR"
}
}
}const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/customer', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "pageInfo": {
- "skip": 0,
- "limit": 10,
- "hasPreviousPage": false,
- "hasNextPage": true
}, - "customers": {
- "customer": {
- "name": "Dan",
- "phone": "5511999999999",
- "taxID": {
- "taxID": "31324227036",
- "type": "BR:CPF"
}
}
}
}Endpoint to create a new Customer
Data to create a new customer
| name required | string |
string | |
| phone | string |
| taxID required | string |
| correlationID | string |
object |
{- "name": "Dan",
- "taxID": "31324227036",
- "phone": "5511999999999",
- "correlationID": "9134e286-6f71-427a-bf00-241681624586",
- "address": {
- "zipcode": "30421322",
- "street": "Street",
- "number": "100",
- "neighborhood": "Neighborhood",
- "city": "Belo Horizonte",
- "state": "MG",
- "complement": "APTO",
- "country": "BR"
}
}{- "customer": {
- "name": "Dan",
- "phone": "5511999999999",
- "taxID": {
- "taxID": "31324227036",
- "type": "BR:CPF"
}, - "address": {
- "zipcode": "30421322",
- "street": "Street",
- "number": "100",
- "neighborhood": "Neighborhood",
- "city": "Belo Horizonte",
- "state": "MG",
- "complement": "APTO",
- "country": "BR"
}
}
}Upload evidence files for a dispute (MED).
| id required | string id of the dispute the evidence belongs to |
Array of objects documents for upload | |||||||||
Array
| |||||||||
{- "documents": [
- {
- "url": "string",
- "fileId": "string",
- "correlationID": "string",
- "description": "string"
}
]
}{- "documents": [
- {
- "fileId": "68c7d0a1f0b2c3d4e5f60718",
- "correlationID": "id123456789",
- "description": "description for my document"
}
]
}| id required | string Example: Ea9c291526ae54b4cb41d9909bdf6d792 The id must be the endToEndId of the transaction that originated the Dispute |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/dispute/Ea9c291526ae54b4cb41d9909bdf6d792', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "dispute": {
- "status": "ACCEPTED",
- "name": "John Doe",
- "phoneNumber": "+5511999999999",
- "value": 10000,
- "disputeReason": "Product not received",
- "endToEndId": "Ea9c291526ae54b4cb41d9909bdf6d792",
- "type": "MED"
}
}| start | string <date-time> (Start Date) Example: start=2020-01-01T00:00:00Z Start date used in the query. Complies with RFC 3339. |
| end | string <date-time> (End Date) Example: end=2020-12-01T17:00:00Z End date used in the query. Complies with RFC 3339. |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/dispute?start=2020-01-01T00%3A00%3A00Z&end=2020-12-01T17%3A00%3A00Z', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "pageInfo": {
- "skip": 0,
- "limit": 10,
- "hasPreviousPage": false,
- "hasNextPage": true
}, - "disputes": [
- {
- "disputeReason": "Dispute reason test",
- "name": "Seu Jorge",
- "phoneNumber": "+551199999999",
- "status": "IN_REVIEW",
- "value": 100,
- "createdAt": "2021-03-02T17:28:51.882Z",
- "updatedAt": "2021-03-02T17:28:51.882Z"
}
]
}Uploads a file and returns its metadata with a pre-signed download URL.
The file is sent as multipart/form-data on the file field, together
with the purpose that describes what the file is for.
Send exactly one file per request, of one of the supported content types,
up to 10 MiB (10485760 bytes).
When you send a correlationID, repeating the request with the same
correlationID and purpose returns the file already stored (200)
instead of uploading a second copy, so the request is safe to retry.
Without a correlationID one is generated for you and every call stores a
new file.
The url in the response is temporary and expires at urlExpiresAt; ask
for the file again to get a fresh one.
| file required | string <binary> The file itself. Its content type must be one of
|
| purpose required | string (FilePurpose) Value: "DISPUTE_EVIDENCE" What the file will be used for |
| correlationID | string non-empty Your own identifier for this upload. Reusing it for the same purpose returns the file stored on the first call. Defaults to a generated UUID. |
const http = require('https'); const options = { method: 'POST', hostname: 'api.woovi.com', port: null, path: '/api/v1/files', headers: { Authorization: '{APP_ID}', 'content-type': 'multipart/form-data; boundary=---011000010111000001101001' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.write('-----011000010111000001101001\r\nContent-Disposition: form-data; name="file"\r\n\r\nstring\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name="purpose"\r\n\r\nDISPUTE_EVIDENCE\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name="correlationID"\r\n\r\nevidence-2026-08-1042\r\n-----011000010111000001101001--\r\n'); req.end();
{- "file": {
- "id": "6712c2ac7c2f1e0012a4b8d1",
- "correlationID": "evidence-2026-08-1042",
- "purpose": "DISPUTE_EVIDENCE",
- "fileName": "evidence.png",
- "contentType": "image/png",
- "size": 20480,
- "urlExpiresAt": "2026-08-22T15:30:00.000Z",
- "createdAt": "2026-08-22T14:30:00.000Z"
}
}Endpoints to manage funds recoveries (MED — Mecanismo Especial de Devolução).
A funds recovery lets you request the return of a Pix transaction sent from your account in case of scam or fraud. The Central Bank tracks the money path across Pix participants and opens refund solicitations on the accounts the funds went through.
These endpoints require the MED API feature enabled on your account. Contact our support to enable it.
Endpoint to cancel a funds recovery (MED). The request does not need a body.
Only funds recoveries opened by your account that have not reached a terminal status (COMPLETED or CANCELLED) can be cancelled.
| id required | string <uuid> Example: 3e760cd5-39b2-45da-8ab6-b212cf205568 The |
const http = require('https'); const options = { method: 'POST', hostname: 'api.woovi.com', port: null, path: '/api/v1/funds-recovery/3e760cd5-39b2-45da-8ab6-b212cf205568/cancel', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "rootTransactionId": "E31680151202606101530AbCdEf12345",
- "situationType": "SCAM",
- "reportDetails": "Payment made to a fake seller. After the payment, the seller stopped responding and never delivered the product.",
- "dictId": "3e760cd5-39b2-45da-8ab6-b212cf205568",
- "status": "CANCELLED",
- "direction": "SENT",
- "reporterParticipant": "31680151",
- "creationTime": "2026-06-11T00:30:00.000Z",
- "lastModified": "2026-06-11T01:10:00.000Z",
- "createdAt": "2026-06-11T00:30:00.000Z",
- "updatedAt": "2026-06-11T01:10:00.000Z"
}Endpoint to get a funds recovery (MED). Use it to follow the progress of the funds recovery through the status and events fields.
| id required | string <uuid> Example: 3e760cd5-39b2-45da-8ab6-b212cf205568 The |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/funds-recovery/3e760cd5-39b2-45da-8ab6-b212cf205568', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "rootTransactionId": "E31680151202606101530AbCdEf12345",
- "situationType": "SCAM",
- "reportDetails": "Payment made to a fake seller. After the payment, the seller stopped responding and never delivered the product.",
- "dictId": "3e760cd5-39b2-45da-8ab6-b212cf205568",
- "status": "AWAITING_ANALYSIS",
- "direction": "SENT",
- "reporterParticipant": "31680151",
- "creationTime": "2026-06-11T00:30:00.000Z",
- "lastModified": "2026-06-11T00:35:00.000Z",
- "events": [
- {
- "id": "f3a1c9d2-8b47-4e6a-9c21-5d7e0a4b8f13",
- "event": "AWAITING_ANALYSIS",
- "timestamp": "2026-06-11T00:35:00.000Z"
}
], - "createdAt": "2026-06-11T00:30:00.000Z",
- "updatedAt": "2026-06-11T00:35:00.000Z"
}Endpoint to open a funds recovery (MED) for a Pix transaction sent from your account.
Only one funds recovery can be opened per transaction. The transaction must have been sent from your account and cannot have been rejected.
Data to open a funds recovery
| transactionEndToEndId required | string The endToEndId of the Pix transaction sent from your account that you want to recover |
| situationType required | string Enum: "SCAM" "ACCOUNT_TAKEOVER" "COERCION" "FRAUDULENT_ACCESS" "OTHER" "UNKNOWN" The situation that motivated the funds recovery:
|
| details required | string Detailed description of what happened. The more context, the better for the analysis. |
{- "transactionEndToEndId": "E31680151202606101530AbCdEf12345",
- "situationType": "SCAM",
- "details": "Payment made to a fake seller. After the payment, the seller stopped responding and never delivered the product."
}{- "rootTransactionId": "E31680151202606101530AbCdEf12345",
- "situationType": "SCAM",
- "reportDetails": "Payment made to a fake seller. After the payment, the seller stopped responding and never delivered the product.",
- "dictId": "3e760cd5-39b2-45da-8ab6-b212cf205568",
- "status": "CREATED",
- "direction": "SENT",
- "reporterParticipant": "31680151",
- "creationTime": "2026-06-11T00:30:00.000Z",
- "lastModified": "2026-06-11T00:30:00.000Z",
- "events": [ ],
- "createdAt": "2026-06-11T00:30:00.000Z",
- "updatedAt": "2026-06-11T00:30:00.000Z"
}Creates a new KYC onboarding for a merchant. Returns a link that should be sent to the merchant so they can fill in their registration data.
The API is idempotent by correlationID. If the same correlationID is sent again
for the same company, the API returns the existing onboarding link (200 OK) instead
of creating a new one.
The fields officialName, tradeName and representatives[].name are automatically
populated via data enrichment when available. You do not need to send them in the request.
website and businessDescription can be pre-filled by the caller. In the Brazilian
flow businessDescription is the only field gating the COMPANY_DATA onboarding step,
so sending it here lets the merchant skip that step of the wizard. On an idempotent
replay both fields are only written when still empty — data typed by the applicant is
never overwritten.
If redirectUrl is provided, the merchant is automatically redirected to that URL
5 seconds after completing the onboarding flow (terminal states: submitted, approved,
or rejected). The redirectUrl is bound to the onboarding link at creation time and
cannot be changed later — subsequent idempotent calls will return the original value.
| taxID required | string TaxID da empresa do merchant. CNPJ no fluxo brasileiro; EIN/CUIT/RUC
etc. quando |
| taxIDType | string Tipo do taxID da empresa. Default |
| partner | boolean Default: false Opt-in para criar uma empresa afiliada (partner-style). Quando true,
exige |
| internationalAccount | boolean Default: false Quando true, cria onboarding internacional ( |
| correlationID | string Identificador unico para idempotencia. Se nao informado, o taxID sera usado. |
| website | string <uri> Website da empresa do merchant. Gravado no AccountRegister e, no modo
|
| businessDescription | string Descricao da atividade da empresa. Gravado no AccountRegister e, no
fluxo brasileiro, e o unico campo que libera a etapa |
| redirectUrl | string <uri> URL para onde o merchant sera redirecionado apos concluir o onboarding. Quando informado, a pagina final do fluxo KYC redireciona automaticamente apos 5 segundos. |
Array of objects (KycOnboardingRepresentative) Socios/representantes da empresa (fluxo brasileiro) | |
object (KycOnboardingCompanyPayload) When | |
object (KycOnboardingUserPayload) Optional admin user created for the affiliate company. When omitted, the affiliate is created without an admin user. |
{- "taxID": "XX.XXX.XXX/0001-XX"
}{- "accountRegister": {
- "status": "PENDING",
- "officialName": "RAZAO_SOCIAL_DA_EMPRESA",
- "tradeName": "NOME_FANTASIA_DA_EMPRESA",
- "taxID": {
- "taxID": "XXXXXXXXXXXXXX",
- "type": "BR:CNPJ"
}, - "correlationID": "my-unique-id",
- "businessDescription": "Venda de roupas e acessorios pela internet",
- "representatives": [
- {
- "name": "NOME_DO_SOCIO",
- "taxID": {
- "taxID": "XXXXXXXXXXX",
- "type": "BR:CPF"
}
}
]
}
}Reads back a validation created with POST /api/v1/kyc-validation/taxid, scoped to
your own company. Free — reading a validation is never billed.
Poll this until status leaves PROCESSING, or subscribe to the
KYC_VALIDATION_COMPLETED / KYC_VALIDATION_FAILED webhook events and skip the
polling entirely.
Requires the KYC_VALIDATION feature on the company and the KYC_VALIDATION_GET
scope on the application.
| correlationID required | string <= 128 characters Example: my-unique-id The |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/kyc-validation/my-unique-id', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "correlationID": "my-unique-id",
- "taxId": "02916265000160",
- "status": "COMPLETED",
- "result": "REJECTED",
- "riskLevel": "HIGH",
- "reasons": [
- "FRAUD_HISTORY",
- "DISPUTE_HISTORY"
], - "createdAt": "2026-08-24T14:00:06.386Z",
- "completedAt": "2026-08-24T14:00:06.462Z"
}Screens a CPF or CNPJ against fraud, dispute, sanctions, PEP and lawsuit signals and returns a verdict.
Requires the KYC_VALIDATION feature on the company and the KYC_VALIDATION_POST
scope on the application.
| taxId required | string CPF (11 digits) or CNPJ (14 digits) to be screened. A mask is accepted — everything that is not a digit is stripped before validation. |
| correlationID required | string [ 1 .. 128 ] characters Your own identifier for this validation. It is the idempotency key: sending
the same |
{- "taxId": "02.916.265/0001-60",
- "correlationID": "my-unique-id"
}{- "correlationID": "my-unique-id",
- "taxId": "02916265000160",
- "status": "COMPLETED",
- "result": "REJECTED",
- "riskLevel": "HIGH",
- "reasons": [
- "FRAUD_HISTORY",
- "DISPUTE_HISTORY"
], - "createdAt": "2026-08-24T14:00:06.386Z",
- "completedAt": "2026-08-24T14:00:06.462Z"
}Endpoints to query account limits for a given bank account.
Limits are expressed in cents and split into a day and a night window,
delimited by dayStartAt and nightStartAt. A limit field that is absent
from the response has no cap configured for that window.
Returns the limit-increase requests of your company, newest first.
| limit | integer How many requests to return (max 100, default 20) |
| skip | integer How many requests to skip |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/limits/request?limit=SOME_INTEGER_VALUE&skip=SOME_INTEGER_VALUE', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "limitRequests": [
- {
- "id": "68c7d0a1f0b2c3d4e5f60718",
- "companyBankAccountId": "65f1c2e9a1b2c3d4e5f60718",
- "status": "IN_REVIEW",
- "requestedLimits": {
- "pixDayLimit": 0,
- "pixNightLimit": 0,
- "pixOutSameHolderDayLimit": 0,
- "pixOutSameHolderNightLimit": 0,
- "pixOutDifferentHolderDayLimit": 0,
- "pixOutDifferentHolderNightLimit": 0,
- "pixInSameHolderDayLimit": 0,
- "pixInSameHolderNightLimit": 0,
- "pixInDifferentHolderDayLimit": 0,
- "pixInDifferentHolderNightLimit": 0
}, - "approvedLimits": {
- "pixDayLimit": 0,
- "pixNightLimit": 0,
- "pixOutSameHolderDayLimit": 0,
- "pixOutSameHolderNightLimit": 0,
- "pixOutDifferentHolderDayLimit": 0,
- "pixOutDifferentHolderNightLimit": 0,
- "pixInSameHolderDayLimit": 0,
- "pixInSameHolderNightLimit": 0,
- "pixInDifferentHolderDayLimit": 0,
- "pixInDifferentHolderNightLimit": 0
}, - "documents": [
- {
- "fileName": "faturamento.pdf",
- "contentType": "application/pdf"
}
], - "description": "string",
- "limitRequestReason": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
], - "pageInfo": {
- "skip": 0,
- "limit": 0,
- "totalCount": 0
}
}Opens a limit-increase request for one of your accounts. It is created with
status: IN_REVIEW; poll
GET /api/v1/limits/request/{limitRequestId}
until it becomes APPROVED (with approvedLimits) or REJECTED.
A limit request is never accepted without at least one document justifying it, and the document does not travel in this request. It is a two-step flow, and the order matters:
Step 1 — upload the file. Send it to
POST /api/v1/files as multipart/form-data,
with purpose=ACCOUNT_LIMIT_REQUEST. That endpoint needs the
FILE_POST scope and accepts application/pdf, image/png, image/jpeg
and image/webp up to 10 MiB. Keep the file.id it returns.
curl -X POST https://api.woovi.com/api/v1/files \
-H 'Authorization: <your AppID>' \
-F 'purpose=ACCOUNT_LIMIT_REQUEST' \
-F '[email protected]'
Step 2 — open the request with that id, in documents[].fileId:
curl -X POST https://api.woovi.com/api/v1/limits/request \
-H 'Authorization: <your AppID>' \
-H 'Content-Type: application/json' \
-d '{"companyBankAccountId":"65f1c2e9a1b2c3d4e5f60718",
"pixDayLimit":5000000,
"pixNightLimit":200000,
"documents":[{"fileId":"68c7d0a1f0b2c3d4e5f60718"}]}'
A fileId is only accepted when the file belongs to your company and
was uploaded with purpose=ACCOUNT_LIMIT_REQUEST. Anything else — a file
of another company, another purpose, or an id that does not exist —
answers 400 and no request is created. Uploading the file with the wrong
purpose is the most common cause of that 400: upload it again with the
right one, you do not need to delete the first.
Limits are in cents and use the same field names as
GET /api/v1/limits/{accountId}, so read
the current values there, raise the ones you need, and send them here.
pixDayLimit and pixNightLimit are always required. No field may be
below its current value, and at least one must be above it —
otherwise the request is a 400.
Only one request per account can be IN_REVIEW at a time; a second one
answers 409 while the first is still being analysed.
| companyBankAccountId required | string The account whose limits should be raised |
required | Array of objects [ 1 .. 10 ] items The files that justify the increase, between 1 and 10. Upload each one first with POST /api/v1/files using purpose=ACCOUNT_LIMIT_REQUEST. |
| description | string <= 500 characters Free text for the analyst reviewing the request |
| limitRequestReason | string <= 500 characters |
| pixDayLimit required | number |
| pixNightLimit required | number |
| pixOutSameHolderDayLimit | number |
| pixOutSameHolderNightLimit | number |
| pixOutDifferentHolderDayLimit | number |
| pixOutDifferentHolderNightLimit | number |
| pixInSameHolderDayLimit | number |
| pixInSameHolderNightLimit | number |
| pixInDifferentHolderDayLimit | number |
| pixInDifferentHolderNightLimit | number |
{- "companyBankAccountId": "65f1c2e9a1b2c3d4e5f60718",
- "pixDayLimit": 5000000,
- "pixNightLimit": 200000,
- "documents": [
- {
- "fileId": "68c7d0a1f0b2c3d4e5f60718"
}
], - "description": "faturamento dos ultimos 12 meses"
}{- "limitRequest": {
- "id": "68c7d0a1f0b2c3d4e5f6071a",
- "companyBankAccountId": "65f1c2e9a1b2c3d4e5f60718",
- "status": "IN_REVIEW",
- "requestedLimits": {
- "pixDayLimit": 5000000,
- "pixNightLimit": 200000
}, - "documents": [
- {
- "fileName": "faturamento.pdf",
- "contentType": "application/pdf"
}
], - "description": "faturamento dos ultimos 12 meses",
- "createdAt": "2026-09-03T17:49:59.204Z",
- "updatedAt": "2026-09-03T17:49:59.204Z"
}
}Returns one limit-increase request. This is the endpoint to poll after creating a request.
status stays IN_REVIEW until Woovi decides, and then becomes:
APPROVED — approvedLimits carries what was actually granted, and it
may be lower than what you asked for. The account's effective limits
change at the same moment, so
GET /api/v1/limits/{accountId} reflects
them right away.REJECTED — nothing changed on the account. You may open a new request
for the same account once this one is decided.approvedLimits is absent while the request is still IN_REVIEW.
A request of another company answers 404, never a 403 — the id alone
never confirms that a request exists.
| limitRequestId required | string Examples:
Woovi identifier of the limit request |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/limits/request/68c7d0a1f0b2c3d4e5f6071a', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "limitRequest": {
- "id": "68c7d0a1f0b2c3d4e5f6071a",
- "companyBankAccountId": "65f1c2e9a1b2c3d4e5f60718",
- "status": "APPROVED",
- "requestedLimits": {
- "pixDayLimit": 5000000,
- "pixNightLimit": 200000
}, - "approvedLimits": {
- "pixDayLimit": 4500000,
- "pixNightLimit": 200000
}, - "documents": [
- {
- "fileName": "faturamento.pdf",
- "contentType": "application/pdf"
}
], - "createdAt": "2026-09-03T17:49:59.204Z",
- "updatedAt": "2026-09-03T19:12:03.881Z"
}
}Retrieves the most recent account limits configured for a given bank account,
including the stablecoin (stableIn* / stableOut*) limits.
Only the public-safe fields are returned; internal-only fields are stripped from the response.
Fields with no cap configured are omitted from the response.
| accountId required | string Examples:
Bank account identifier (ObjectId) for which limits should be returned |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/limits/65f1c2e9a1b2c3d4e5f60718', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "limits": {
- "pixDayLimit": 4000000,
- "pixNightLimit": 100000,
- "pixOutSameHolderDayLimit": 4000000,
- "pixOutDifferentHolderDayLimit": 4000000,
- "pixOutSameHolderNightLimit": 100000,
- "pixOutDifferentHolderNightLimit": 100000,
- "pixInSameHolderDayLimit": 100000000,
- "pixInDifferentHolderDayLimit": 100000000,
- "pixInSameHolderNightLimit": 100000000,
- "pixInDifferentHolderNightLimit": 100000000,
- "dayStartAt": "06:00",
- "nightStartAt": "20:00",
- "boletoEmissionLimit": 200,
- "boletoMaximumValueLimit": 1000000,
- "stableInDayLimit": 500000,
- "stableInNightLimit": 500000,
- "stableInDayLimitPerTransaction": 500000,
- "stableInNightLimitPerTransaction": 500000,
- "stableOutDayLimit": 500000,
- "stableOutNightLimit": 500000,
- "stableOutDayLimitPerTransaction": 500000,
- "stableOutNightLimitPerTransaction": 500000
}
}Partners integrate affiliated companies.
They can register new companies, manage them, and earn money from them.
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/partner/affiliate', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "affiliates": [
- {
- "company": {
- "id": "Q29tcGFueTo2MDE1MTQ0OWUzYzlhNDAwMTJhYjM0Y2Q=",
- "name": "Affiliate Company One LTDA",
- "taxID": "65914571000187",
- "createdAt": "2026-01-15T13:22:41.000Z"
}, - "account": {
- "clientId": "Client_Id_5f3a1c9e8b7d4a2f",
- "name": "Conta 1234",
- "accountId": "60151449e3c9a40012ab34cd",
- "branch": "0001",
- "account": "1234567"
}
}, - {
- "company": {
- "id": "Q29tcGFueTo2MDE1MTQ0OWUzYzlhNDAwMTJjZDU2ZWY=",
- "name": "Affiliate Company Two LTDA",
- "taxID": "14380200000121",
- "createdAt": "2026-01-12T09:05:18.000Z"
}
}
], - "pageInfo": {
- "skip": 0,
- "limit": 100,
- "hasPreviousPage": false,
- "hasNextPage": true
}
}As a partner company, you can create a new application to some of your companies. The application should give access to our API to this companies, so they can use it too.
The request body to create a pre registration.
object | |
object (TaxIDObjectPayload) |
{- "application": {
- "name": "MyAPIAccessWithScopes",
- "type": "API",
- "scopes": [
- "CHARGE_POST",
- "CHARGE_GET"
]
}, - "taxID": {
- "taxID": "65914571000187",
- "type": "BR:CNPJ"
}
}{- "application": {
- "name": "MyAPIAccessWithScopes",
- "isActive": true,
- "type": "API",
- "clientId": "client_123abc",
- "clientSecret": "secret_456def",
- "scopes": [
- "CHARGE_POST",
- "CHARGE_GET"
]
}
}| taxID required | string Examples:
The raw tax ID from the preregistration that you want to get. |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/partner/company/60151449000182', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "preRegistration": {
- "preRegistration": {
- "name": "string",
- "taxID": {
- "taxID": "string",
- "type": "BR:CNPJ"
}
}, - "user": {
- "firstName": "string",
- "lastName": "string",
- "email": "string",
- "phone": "string",
- "taxID": {
- "taxID": "string",
- "type": "BR:CNPJ"
}
}, - "company": {
- "id": "string",
- "name": "string",
- "taxID": {
- "taxID": "string",
- "type": "BR:CNPJ"
}
}, - "account": {
- "clientId": "string"
}
}
}const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/partner/company', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "preRegistrations": [
- {
- "preRegistration": {
- "name": "string",
- "taxID": {
- "taxID": "string",
- "type": "BR:CNPJ"
}
}, - "user": {
- "firstName": "string",
- "lastName": "string",
- "email": "string",
- "phone": "string",
- "taxID": {
- "taxID": "string",
- "type": "BR:CNPJ"
}
}, - "company": {
- "id": "string",
- "name": "string",
- "taxID": {
- "taxID": "string",
- "type": "BR:CNPJ"
}
}, - "account": {
- "clientId": "string"
}
}
], - "pageInfo": {
- "errors": [
- {
- "message": "string",
- "data": {
- "skip": 0,
- "limit": 0
}
}
], - "skip": 0,
- "limit": 0,
- "hasPreviousPage": true,
- "hasNextPage": true
}
}As a partner company, you can create a new pre registration referencing your company as a partner.
The request body to create a pre registration.
object (PreRegistrationObject) | |
object (PreRegistrationUserObject) |
{- "preRegistration": {
- "name": "Example LLC",
- "taxID": {
- "taxID": "11111111111111",
- "type": "BR:CNPJ"
}, - "website": "examplellc.com"
}, - "user": {
- "firstName": "John",
- "lastName": "Doe",
- "phone": "+5511912345678",
- "taxID": {
- "taxID": "1111111111",
- "type": "BR:CPF"
}
}
}{- "preRegistration": {
- "name": "string",
- "website": "string",
- "taxID": {
- "taxID": "string",
- "type": "BR:CNPJ"
}
}, - "user": {
- "firstName": "string",
- "lastName": "string",
- "email": "string",
- "phone": "string",
- "taxID": {
- "taxID": "string",
- "type": "BR:CNPJ"
}
}
}Endpoints to create and manage Pix payment requests. Supports three payment types:
1. Pix Key (PIX_KEY) - Pay directly to a Pix key (CPF, CNPJ, email, phone, or random key).
2. QR Code (QR_CODE) - Pay a Pix QR Code (BR Code). Send the raw QR Code string and the system will decode it, extract the destination and value automatically.
3. Manual (MANUAL) - Pay by providing the destination bank account details directly (holder, account, branch, PSP).
To pay a QR Code, follow these steps:
POST /api/v1/payment with type: "QR_CODE" and the qrCode field containing the BR Code string. The value is automatically extracted from the QR Code. You can optionally provide a value field to override it (for QR Codes without a fixed value).CREATED).POST /api/v1/payment/approve with the correlationID to execute the payment.GET /api/v1/payment/{id} with the correlationID to verify the payment status and get transaction details.Endpoint to approve a payment
Data to approve a payment request
| correlationID | string the correlation ID of the payment to be approved |
{- "correlationID": "payment1"
}{- "payment": {
- "value": 100,
- "status": "APPROVED",
- "destinationAlias": "c4249323-b4ca-43f2-8139-8232aab09b93",
- "comment": "payment comment",
- "correlationID": "payment1"
}, - "transaction": {
- "value": 100,
- "endToEndId": "transaction-end-to-end-id",
- "time": "2023-03-20T13:14:17.000Z"
}, - "destination": {
- "name": "Dan",
- "taxID": "31324227036",
- "pixKey": "c4249323-b4ca-43f2-8139-8232aab09b93",
- "bank": "A Bank",
- "branch": "1",
- "account": "123456"
}
}| id required | string Examples:
payment ID or correlation ID |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/payment/Q2hhcmdlOjYwM2U3NDlhNDI1NjAyYmJiZjRlN2JlZA==', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "payment": {
- "value": 100,
- "status": "CONFIRMED",
- "destinationAlias": "c4249323-b4ca-43f2-8139-8232aab09b93",
- "comment": "payment comment",
- "correlationID": "payment1",
- "sourceAccountId": "my-source-account-id"
}, - "transaction": {
- "value": 100,
- "endToEndId": "transaction-end-to-end-id",
- "debitParty": {
- "account": {
- "branch": "0001",
- "account": "00000000000000023280",
- "accountType": "TRAN"
}, - "psp": {
- "id": "123456",
- "name": "COMPANY DEBIT LTDA",
- "code": "123456789"
}, - "holder": {
- "name": "name holder",
- "nameFriendly": "name friendly holder"
}, - "taxID": {
- "taxID": "1212345600198",
- "type": "BR:CNPJ"
}
}, - "creditParty": {
- "account": {
- "branch": "0001",
- "account": "00000000000000012345",
- "accountType": "TRAN"
}, - "psp": {
- "id": "123456",
- "name": "COMPANY CREDIT LTDA"
}, - "holder": {
- "name": "name holder",
- "nameFriendly": "name friendly",
- "taxID": {
- "taxID": "00123456000199",
- "type": "BR:CNPJ"
}
}
}, - "time": "2023-03-20T13:14:17.000Z"
}, - "destination": {
- "name": "Dan",
- "taxID": "31324227036",
- "pixKey": "c4249323-b4ca-43f2-8139-8232aab09b93",
- "bank": "A Bank",
- "branch": "1",
- "account": "123456"
}
}const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/payment', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "pageInfo": {
- "skip": 0,
- "limit": 10,
- "hasPreviousPage": false,
- "hasNextPage": true
}, - "payments": {
- "payment": {
- "value": 100,
- "status": "CONFIRMED",
- "destinationAlias": "c4249323-b4ca-43f2-8139-8232aab09b93",
- "comment": "payment comment",
- "correlationID": "payment1",
- "sourceAccountId": "my-source-account-id"
}, - "transaction": {
- "value": 100,
- "endToEndId": "transaction-end-to-end-id",
- "time": "2023-03-20T13:14:17.000Z",
- "debitParty": {
- "account": {
- "branch": "0001",
- "account": "00000000000000023280",
- "accountType": "TRAN"
}, - "psp": {
- "id": "123456",
- "name": "COMPANY DEBIT LTDA",
- "code": "123456789"
}, - "holder": {
- "name": "name holder",
- "nameFriendly": "name friendly holder"
}, - "taxID": {
- "taxID": "1212345600198",
- "type": "BR:CNPJ"
}
}, - "creditParty": {
- "account": {
- "branch": "0001",
- "account": "00000000000000012345",
- "accountType": "TRAN"
}, - "psp": {
- "id": "123456",
- "name": "COMPANY CREDIT LTDA"
}, - "holder": {
- "name": "name holder",
- "nameFriendly": "name friendly",
- "taxID": {
- "taxID": "00123456000199",
- "type": "BR:CNPJ"
}
}
}
}, - "destination": {
- "name": "Dan",
- "taxID": "31324227036",
- "pixKey": "c4249323-b4ca-43f2-8139-8232aab09b93",
- "bank": "A Bank",
- "branch": "1",
- "account": "123456"
}
}
}Endpoint to request a payment. Supports four payment types: Pix Key (PIX_KEY), QR Code (QR_CODE), Manual (MANUAL), and Boleto (BOLETO).
For QR Code payments, the system decodes the BR Code string and extracts the destination and value automatically.
For Boleto payments, send type: "BOLETO" and the boletoBarcode. The amount, due date and beneficiary are resolved from the boleto, so value and destination are not sent in the body. Validate the barcode first with POST /api/v1/boleto/validate.
Set autoApprove: true to create and immediately approve the payment in a single call, returning the enriched response with transaction and destination data. Without this flag, the payment is created in CREATED status and can be approved later via POST /api/v1/payment/approve.
Data to create a payment request
| type required | string Enum: "PIX_KEY" "QR_CODE" "MANUAL" "BOLETO" type of the payment |
| value required | number value of the requested payment in cents |
| destinationAlias required | string the pix key the payment should be sent to |
| destinationAliasType required | string Enum: "CPF" "CNPJ" "EMAIL" "PHONE" "RANDOM" the type of the pix key the payment should be sent to |
| correlationID required | string a unique identifier for your payment |
| pixKeyEndToEndId | string the end to end id of the pix key used for track pix key consultations |
| comment | string the comment that will be sent alongside your payment |
object additional metadata for the payment (max 30 keys) | |
| autoApprove | boolean When true, creates and approves the payment in a single call returning the enriched response. Defaults to false. |
{- "type": "PIX_KEY",
- "value": 100,
- "destinationAlias": "c4249323-b4ca-43f2-8139-8232aab09b93",
- "destinationAliasType": "RANDOM",
- "comment": "payment comment",
- "correlationID": "payment1",
- "pixKeyEndToEndId": "E1234567890",
- "metadata": {
- "orderId": "order-123",
- "userId": "user-456",
- "source": "mobile-app"
}
}{- "payment": {
- "type": "PIX_KEY",
- "value": 100,
- "status": "CREATED",
- "destinationAlias": "c4249323-b4ca-43f2-8139-8232aab09b93",
- "destinationAliasType": "RANDOM",
- "comment": "payment comment",
- "correlationID": "payment1"
}
}Retrieves a list of all Pix keys
| skip | number |
| limit | number |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/pix-keys?skip=SOME_NUMBER_VALUE&limit=SOME_NUMBER_VALUE', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "pixKeys": [
- {
- "key": "string",
- "type": "CPF",
- "isDefault": true
}
], - "account": {
- "accountId": "string",
- "isDefault": true,
- "balance": {
- "total": 0,
- "blocked": 0,
- "available": 0,
- "blockedBySecurity": 0,
- "blockedByWithdrawSafety": 0
}, - "taxId": "string",
- "officialName": "string",
- "tradeName": "string",
- "branch": "string",
- "account": "string",
- "accountName": "string"
}
}Creates a new Pix key
| key required | string |
| type required | string Enum: "CNPJ" "EVP" |
{- "key": "string",
- "type": "CNPJ"
}{- "key": "string",
- "type": "CPF",
- "isDefault": true
}const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/pix-keys/tokens', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "tokens": 0,
- "maxTokens": 0,
- "nextRefresh": "string",
- "tokensAfterRefresh": 0,
- "refreshRate": 0
}Get a list of token bucket operation logs
| skip | number |
| limit | number |
| companyBankAccount | string Filter logs by company bank account ID |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/pix-keys/tokens/logs?skip=SOME_NUMBER_VALUE&limit=SOME_NUMBER_VALUE&companyBankAccount=SOME_STRING_VALUE', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "pageInfo": {
- "skip": 0,
- "limit": 100,
- "hasPreviousPage": false,
- "hasNextPage": false
}, - "logs": [
- {
- "operation": "REMOVE",
- "reason": "pixKeyCheck",
- "tokens": 1,
- "tokensBefore": 100,
- "tokensAfter": 99,
- "endToEndId": "E18236120202012032010s0133872GZA",
- "pixKey": "31324227036",
- "createdAt": "2024-01-15T10:30:00.000Z",
- "updatedAt": "2024-01-15T10:30:00.000Z"
}, - {
- "operation": "ADD",
- "reason": "refill",
- "tokens": 10,
- "tokensBefore": 90,
- "tokensAfter": 100,
- "createdAt": "2024-01-15T11:00:00.000Z",
- "updatedAt": "2024-01-15T11:00:00.000Z"
}
]
}Endpoints to look up the holder of a Pix key through the DICT.
This endpoint is not enabled by default. It queries the DICT for the holder of a Pix key that is not yours, so it has to be requested from support and goes through an internal review before being turned on. Calls are billed per query.
If what you need is to confirm that an account belongs to who you expect, use bank data validation instead — it is available to every account with no approval:
Get data from a Pix key if it exists.
This endpoint is not enabled by default. It queries the DICT for the holder of a Pix key that is not yours, so it has to be requested from support and goes through an internal review before being turned on. Calls are billed per query.
If what you need is to confirm that an account belongs to who you expect, use bank data validation instead — it is available to every account with no approval:
| pixKey required | string The Pix key to check |
{- "pixKey": "string",
- "type": "CPF",
- "pixKeyEndToEndId": "string",
- "owner": {
- "account": "string",
- "branch": "string",
- "psp": "string",
- "name": "string",
- "taxID": "string"
}
}Get data from a Pix key if it exists.
This endpoint is not enabled by default. It queries the DICT for the holder of a Pix key that is not yours, so it has to be requested from support and goes through an internal review before being turned on. Calls are billed per query.
If what you need is to confirm that an account belongs to who you expect, use bank data validation instead — it is available to every account with no approval:
| pixKey required | string The Pix key to check |
{- "pixKey": "string"
}{- "pixKey": "string",
- "type": "CPF",
- "pixKeyEndToEndId": "string",
- "owner": {
- "account": "string",
- "branch": "string",
- "psp": "string",
- "name": "string",
- "taxID": "string"
}
}Endpoint to delete a Pix QrCode Static
| id required | string Examples:
QrCode ID, correlationID or identifier |
const http = require('https'); const options = { method: 'DELETE', hostname: 'api.woovi.com', port: null, path: '/api/v1/qrcode-static/fe7834b4060c488a9b0f89811be5f5cf', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "status": "OK",
- "id": "fe7834b4060c488a9b0f89811be5f5cf"
}| id required | string Examples:
pixQrCode ID, correlation ID or emv identifier |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/qrcode-static/Q2hhcmdlOjYwM2U3NDlhNDI1NjAyYmJiZjRlN2JlZA==', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "pixQrCode": {
- "name": "pix qrcode static",
- "value": 100,
- "comment": "pix qrcode static",
- "correlationID": "fe7834b4060c488a9b0f89811be5f5cf",
- "identifier": "zr7833b4060c488a9b0f89811",
- "paymentLinkID": "7777-6f71-427a-bf00-241681624586",
- "brCode": "000201010212261060014br.gov.bcb.pix2584https://api.woovi.com/openpix/testing?transactionID=867ba5173c734202ac659721306b38c952040000530398654040.015802BR5909LOCALHOST6009Sao Paulo62360532867ba5173c734202ac659721306b38c963044BCA",
- "createdAt": "2021-03-02T17:28:51.882Z",
- "updatedAt": "2021-03-02T17:28:51.882Z"
}
}const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/qrcode-static', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "pageInfo": {
- "skip": 0,
- "limit": 10,
- "hasPreviousPage": false,
- "hasNextPage": true
}, - "pixQrCodes": {
- "name": "pix qrcode",
- "value": 100,
- "comment": "good",
- "correlationID": "9134e286-6f71-427a-bf00-241681624586",
- "identifier": "zr7833b4060c488a9b0f89811",
- "paymentLinkID": "7777a23s-6f71-427a-bf00-241681624586",
- "brCode": "000201010212261060014br.gov.bcb.pix2584https://api.woovi.com/openpix/testing?transactionID=867ba5173c734202ac659721306b38c952040000530398654040.015802BR5909LOCALHOST6009Sao Paulo62360532867ba5173c734202ac659721306b38c963044BCA",
- "createdAt": "2021-03-02T17:28:51.882Z",
- "updatedAt": "2021-03-02T17:28:51.882Z"
}
}Endpoint to create a new Pix QrCode Static
Data to create a new Pix QrCode Static
| name required | string Name of this pix qrcode |
| correlationID | string Your correlation ID to keep track of this qrcode |
| value | number Value in cents of this qrcode |
| comment | string Comment to be added in infoPagador |
| pixKey | string The pix key that this qrcode is associated with |
{- "name": "my-qr-code",
- "correlationID": "9134e286-6f71-427a-bf00-241681624586",
- "value": 100,
- "comment": "good"
}{- "pixQrCode": {
- "value": 100,
- "comment": "good",
- "correlationID": "9134e286-6f71-427a-bf00-241681624586",
- "identifier": "zr7833b4060c488a9b0f89811",
- "paymentLinkID": "7777a23s-6f71-427a-bf00-241681624586",
- "createdAt": "2021-03-02T17:28:51.882Z",
- "updatedAt": "2021-03-02T17:28:51.882Z",
- "brCode": "000201010212261060014br.gov.bcb.pix2584https://api.woovi.com/openpix/testing?transactionID=867ba5173c734202ac659721306b38c952040000530398654040.015802BR5909LOCALHOST6009Sao Paulo62360532867ba5173c734202ac659721306b38c963044BCA"
}
}| id required | string you can use the transaction id from openpix or the endToEndId of transaction from bank |
| companyBankAccount | string Example: companyBankAccount=507f1f77bcf86cd799439011 Restrict the lookup to another bank account of your company instead of the one linked to the appID. Only a MASTER application of a company with the MASTER_APP_READ_ANY_ACCOUNT feature can use it. Use the accountId returned by GET /api/v1/account. |
{- "transaction": {
- "customer": {
- "name": "Dan",
- "phone": "5511999999999",
- "taxID": {
- "taxID": "31324227036",
- "type": "BR:CPF"
}, - "correlationID": "9134e286-6f71-427a-bf00-241681624586"
}, - "payer": {
- "name": "Dan",
- "phone": "5511999999999",
- "taxID": {
- "taxID": "31324227036",
- "type": "BR:CPF"
}, - "correlationID": "9134e286-6f71-427a-bf00-241681624586"
}, - "charge": {
- "status": "ACTIVE",
- "customer": "603f81fcc6bccc24326ffb43",
- "correlationID": "9134e286-6f71-427a-bf00-241681624586",
- "createdAt": "2021-03-03T12:33:00.546Z",
- "updatedAt": "2021-03-03T12:33:00.546Z"
}, - "withdraw": {
- "value": 100,
- "time": "2021-03-03T12:33:00.536Z",
- "infoPagador": "payer info 1",
- "endToEndId": "E18236120202012032010s01345689XBY",
- "createdAt": "2021-03-03T12:33:00.546Z"
}, - "infoPagador": "payer info 0",
- "value": 100,
- "time": "2021-03-03T12:33:00.536Z",
- "transactionID": "transactionID",
- "type": "PAYMENT",
- "endToEndId": "E18236120202012032010s0133872GZA",
- "globalID": "UGl4VHJhbnNhY3Rpb246NzE5MWYxYjAyMDQ2YmY1ZjUzZGNmYTBi",
- "creditParty": {
- "account": {
- "account": "00000000000005469660",
- "accountType": "CACC",
- "branch": "8615"
}, - "holder": {
- "name": "CREDIT PARTY NAME",
- "nameFriendly": "CREDIT PARTY NAME FRIENDLY",
- "taxID": {
- "taxID": "28613271892",
- "type": "BR:CPF"
}
}, - "psp": {
- "id": "00000001",
- "name": "BCO DO BRASIL S.A."
}
}, - "debitParty": {
- "account": {
- "account": "1235678",
- "accountType": "TRAN",
- "branch": "1"
}, - "holder": {
- "name": "Awesome Company 1",
- "nameFriendly": "Call me Awesome"
}, - "psp": {
- "code": "54811417",
- "id": "FROZEN-ID",
- "name": "WOOVI IP LTDA"
}
}
}
}| start | string <date-time> (Start Date) Example: start=2020-01-01T00:00:00Z Start date used in the query. Complies with RFC 3339. |
| end | string <date-time> (End Date) Example: end=2020-12-01T17:00:00Z End date used in the query. Complies with RFC 3339. |
| charge | string Example: charge=Q2hhcmdlOjYwM2U3NDlhNDI1NjAyYmJiZjRlN2JlZA You can use the charge ID or correlation ID or transaction ID of charge to get a list of transactions related of this transaction |
| pixQrCode | string Example: pixQrCode=Q2hhcmdlOjYwM2U3NDlhNDI1NjAyYmJiZjRlN2JlZA You can use the QrCode static ID or correlation ID or identifier field of QrCode static to get a list of QrCode related of this transaction |
| withdrawal | string Example: withdrawal=Q2hhcmdlOjYwM2U3NDlhNDI1NjAyYmJiZjRlN2JlZA You can use the ID or EndToEndId of a withdrawal transaction to get all transactions related to the withdrawal |
| hasWebhook | boolean Example: hasWebhook=true Filter transactions by webhook delivery status. Use true to get only transactions that had a successful webhook delivery (HTTP 200), or false to get transactions without successful webhook delivery. |
| type | string Enum: "PAYMENT" "WITHDRAW" "REFUND" "FEE" "INTERNAL_TRANSFER" "BALANCE_BLOCK" "BALANCE_UNBLOCK" "REVERSAL" Example: type=REFUND Filter transactions by type |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/transaction?start=2020-01-01T00%3A00%3A00Z&end=2020-12-01T17%3A00%3A00Z&charge=Q2hhcmdlOjYwM2U3NDlhNDI1NjAyYmJiZjRlN2JlZA&pixQrCode=Q2hhcmdlOjYwM2U3NDlhNDI1NjAyYmJiZjRlN2JlZA&withdrawal=Q2hhcmdlOjYwM2U3NDlhNDI1NjAyYmJiZjRlN2JlZA&hasWebhook=true&type=REFUND', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "pageInfo": {
- "skip": 0,
- "limit": 10,
- "hasPreviousPage": false,
- "hasNextPage": true
}, - "transactions": {
- "customer": {
- "name": "Dan",
- "phone": "5511999999999",
- "taxID": {
- "taxID": "31324227036",
- "type": "BR:CPF"
}, - "correlationID": "9134e286-6f71-427a-bf00-241681624586"
}, - "payer": {
- "name": "Dan",
- "phone": "5511999999999",
- "taxID": {
- "taxID": "31324227036",
- "type": "BR:CPF"
}, - "correlationID": "9134e286-6f71-427a-bf00-241681624586"
}, - "charge": {
- "status": "ACTIVE",
- "customer": "603f81fcc6bccc24326ffb43",
- "correlationID": "9134e286-6f71-427a-bf00-241681624586",
- "createdAt": "2021-03-03T12:33:00.546Z",
- "updatedAt": "2021-03-03T12:33:00.546Z"
}, - "withdraw": {
- "value": 100,
- "time": "2021-03-03T12:33:00.536Z",
- "infoPagador": "payer info 1",
- "endToEndId": "E18236120202012032010s01345689XBY"
}, - "type": "PAYMENT",
- "infoPagador": "payer info 0",
- "value": 100,
- "time": "2021-03-03T12:33:00.536Z",
- "transactionID": "transactionID",
- "endToEndId": "E18236120202012032010s0133872GZA",
- "webhookSent": [
- {
- "OPENPIX:TRANSACTION_RECEIVED": {
- "status": 200,
- "time": "2021-03-03T12:33:00.546Z"
}, - "isRetry": false
}
]
}
}| id required | string Examples:
refund ID or correlation ID |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/refund/Q2hhcmdlOjYwM2U3NDlhNDI1NjAyYmJiZjRlN2JlZA==', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "pixTransactionRefund": {
- "value": 100,
- "correlationID": "7777-6f71-427a-bf00-241681624586",
- "refundId": "11bf5b37e0b842e08dcfdc8c4aefc000",
- "returnIdentification": "D09089356202108032000a543e325902",
- "comment": "Comentário do reembolso"
}
}const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/refund', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "pageInfo": {
- "skip": 0,
- "limit": 10,
- "hasPreviousPage": false,
- "hasNextPage": true
}, - "refunds": [
- {
- "status": "IN_PROCESSING",
- "value": 100,
- "correlationID": "9134e286-6f71-427a-bf00-241681624586",
- "refundId": "9134e2866f71427abf00241681624586",
- "time": "2021-03-02T17:28:51.882Z",
- "comment": "Comentário do reembolso"
}
]
}Endpoint to create a new refund for a customer
Data to create a new refund
| value | number |
| transactionEndToEndId | string Your transaction ID, or endToEnd ID, to keep track of this refund |
| correlationID | string Your correlation ID, unique identifier refund |
| comment | string <= 140 Comment of this refund. Maximum length of 140 characters. |
{- "transactionEndToEndId": "9134e286-6f71-427a-bf00-241681624586",
- "correlationID": "9134e286-6f71-427a-bf00-241681624586",
- "value": 100,
- "comment": "Comentário do reembolso"
}{- "refund": {
- "status": "IN_PROCESSING",
- "value": 100,
- "correlationID": "9134e286-6f71-427a-bf00-241681624586",
- "refundId": "9134e2866f71427abf00241681624586",
- "time": "2021-03-02T17:28:51.882Z",
- "comment": "Comentário do reembolso"
}
}Endpoints to manage Payment Service Providers (PSPs) in the PIX ecosystem.
PSPs are financial institutions that can process PIX payments. Each PSP has unique identifiers like ISPB and COMPE codes used for identification and validation.
| ispb | string Example: ispb=3030310 Filter PSPs by ISPB code |
| name | string Example: name=brasil Filter PSPs by name |
| compe | string Example: compe=001 Filter PSPs by COMPE code |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/psp?ispb=3030310&name=brasil&compe=001', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "success": true,
- "psps": [
- {
- "name": "BCO DO BRASIL S.A.",
- "ispb": "00000000",
- "code": "00000000",
- "compe": "001"
}, - {
- "name": "CAIXA ECONOMICA FEDERAL",
- "ispb": "00360305",
- "code": "00360305",
- "compe": "104"
}
]
}| ReceiptType required | string Enum: "pix-in" "pix-out" "pix-refund" Examples:
The ReceiptType from the payment transaction to export. |
| EndToEndId required | string Examples:
The EndToEndId from the payment transaction to export. |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/receipt/pix-in/E12345678202406201221abcdef12345', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "error": "string"
}Approves a previously created stablecoin deposit identified by its correlationId,
triggering the on-chain settlement (pay the stable qrcode) for the company's deposit.
The deposit moves to PROCESSING while settlement is in flight. The call is rejected
with 400 when the deposit cannot be approved, e.g. it was already COMPLETED, it is
already PROCESSING, there is no source account to pay it, or the provider quote/payment
fails.
Requires the STABLECOIN_DEPOSIT_CREATE scope.
| correlationId required | string non-empty The correlationId supplied when the deposit was created. |
{- "correlationId": "my-unique-id"
}{- "status": "PROCESSING",
- "correlationId": "my-unique-id",
- "depositId": "6650abc1234def567890aaaa"
}Creates a stablecoin deposit (PIX-in to stable-out) for a company. The deposit converts a BRL amount (in cents) into the requested stablecoin on the chosen network and returns a quote with the applied fees.
There are two fee models, and the amount field you send picks one:
grossAmount (recommended): all-in. The Woovi fee comes OUT of it, so the account
is debited exactly grossAmount and the provider is paid the remainder.value (legacy): the amount paid to the provider, with the Woovi fee charged ON
TOP — the account is debited value + wooviFee.Either way the response breaks the total down into wooviFee and providerFee, and
GET /api/v1/stablecoin/quote reports the same numbers for the same input.
The deposit is always credited to the stable subaccount of the CompanyBankAccount
linked to the authenticated AppID. The AppID must have a companyBankAccount
configured (otherwise 400 APPLICATION_COMPANY_BANK_ACCOUNT_MISSING), and that bank
account must have a stable subaccount in CONFIRMED status (a completed KYB) —
another bank account's subaccount on the same company is never used. Otherwise the
request is rejected with a 400.
subAccountId, when sent, must belong to that same CompanyBankAccount.
Not every asset is available on every network. The supported matrix is:
If network is omitted it defaults to POLYGON. Sending an asset/network combination
outside the matrix above returns a 400.
Idempotency is supported via correlationId.
| value required | number Amount to deposit, in cents (BRL). Must be positive. |
| currency required | string Enum: "USDT" "USDC" "BRLA" Stablecoin to receive. |
| network | string Default: "POLYGON" Enum: "POLYGON" "ETHEREUM" "BASE" "CELO" "TRON" "BNB" Network to receive the stablecoin on. Defaults to POLYGON. Must be supported for the chosen currency. |
| subAccountId | string Stable subaccount id to use. Optional; resolved from the company when omitted. |
| correlationId | string Unique identifier for idempotency. Optional. |
| destinationWalletAddress | string Explicit destination wallet address for the stablecoin. Optional. |
{- "grossAmount": 10000,
- "currency": "USDT"
}{- "status": "PENDING",
- "depositId": "6650...",
- "correlationId": "my-unique-id",
- "expiration": "2026-06-05T12:00:00.000Z",
- "quote": {
- "inputAmount": 10000,
- "inputCurrency": "BRL",
- "outputAmount": 18.45,
- "outputCurrency": "USDT",
- "rate": 5.42,
- "fee": 50
}
}Step 1 of the monthly limit-increase flow: returns a pre-signed URL to upload one supporting document (comprovante) — proof of financial capacity, company address proof or UBO (partner) address proof.
The file goes straight from the client to storage; it never transits the
API. The URL is scoped to a key that belongs to the authenticated company,
is single use and expires in expiresIn seconds.
Upload it with PUT <uploadUrl> sending the same Content-Type returned
in headers and the raw file as the body — no multipart, no extra
headers. Then post the returned document object on
POST /api/v1/stablecoin/limit/request (or on
POST /api/v1/stablecoin/limit/request/{limitRequestId}/document).
Files above maxSizeBytes, or whose content type is not one of
application/pdf, image/jpeg, image/png, image/webp, are rejected
when the document is attached to the request.
Requires the STABLECOIN_SUBACCOUNT_CREATE scope and the company
STABLECOIN feature.
| type required | string (StablecoinLimitDocumentType) Enum: "PROOF_OF_FINANCIAL_CAPACITY" "PROOF_OF_ADDRESS_COMPANY" "PROOF_OF_ADDRESS_UBO" Category of the supporting document (comprovante): |
| fileName required | string Original file name. Sanitized before it becomes the object key. |
| mimeType required | string Enum: "application/pdf" "image/jpeg" "image/png" "image/webp" Content type of the file. Signed into the upload URL: the |
{- "type": "PROOF_OF_ADDRESS_COMPANY",
- "fileName": "comprovante-endereco-empresa.pdf",
- "mimeType": "application/pdf"
}{- "method": "PUT",
- "headers": {
- "Content-Type": "application/pdf"
}, - "expiresIn": 900,
- "maxSizeBytes": 10485760,
- "document": {
- "type": "PROOF_OF_ADDRESS_COMPANY",
- "bucketName": "woovi-media",
- "path": "stablecoin/limit-request/6650abc1234def567890aaaa/8f1c-comprovante.pdf",
- "fileName": "comprovante.pdf",
- "mimeType": "application/pdf"
}
}Attaches one more comprovante to a request that is still IN_REVIEW —
the path for "the analysis asked for another address proof" or for
retrying a document whose submissionStatus came back FAILED.
The document must have been uploaded through
POST /api/v1/stablecoin/limit/document first, and the same ownership,
size and content-type checks of the create call apply. A request accepts
at most 10 documents.
The push to the KYB provider runs in the background: poll
GET /api/v1/stablecoin/limit/request/{limitRequestId}.
Requires the STABLECOIN_SUBACCOUNT_CREATE scope and the company
STABLECOIN feature.
| limitRequestId required | string Example: 6650abc1234def567890bbbb The |
| type required | string (StablecoinLimitDocumentType) Enum: "PROOF_OF_FINANCIAL_CAPACITY" "PROOF_OF_ADDRESS_COMPANY" "PROOF_OF_ADDRESS_UBO" Category of the supporting document (comprovante): |
| bucketName required | string |
| path required | string |
| fileName | string |
| mimeType | string |
{- "type": "PROOF_OF_ADDRESS_UBO",
- "bucketName": "woovi-media",
- "path": "stablecoin/limit-request/6650abc1234def567890aaaa/91ae-endereco-socio.pdf",
- "fileName": "endereco-socio.pdf",
- "mimeType": "application/pdf"
}{- "limitRequestId": "6650abc1234def567890bbbb",
- "companyBankAccountId": "6650abc1234def567890dddd",
- "status": "IN_REVIEW",
- "desiredMonthlyLimit": 50000000,
- "description": "Aumento de volume para folha de pagamento",
- "submissionStatus": "PROCESSING",
- "documents": [
- {
- "documentId": "6650abc1234def567890cccc",
- "type": "PROOF_OF_ADDRESS_COMPANY",
- "fileName": "comprovante.pdf",
- "mimeType": "application/pdf",
- "sentToProvider": true
}
], - "createdAt": "2026-08-06T12:00:00.000Z",
- "updatedAt": "2026-08-06T12:00:00.000Z"
}Returns the request, its documents and how far the delivery to the KYB
provider got (submissionStatus).
status is the analysis outcome (IN_REVIEW, APPROVED, REJECTED) —
the monthly ceiling is raised by the analysis team, so APPROVED is what
tells the merchant the new limit is in place.
Requires the STABLECOIN_SUBACCOUNT_LIST scope and the company
STABLECOIN feature.
| limitRequestId required | string Example: 6650abc1234def567890bbbb The |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/stablecoin/limit/request/6650abc1234def567890bbbb', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "limitRequestId": "6650abc1234def567890bbbb",
- "companyBankAccountId": "6650abc1234def567890dddd",
- "status": "IN_REVIEW",
- "desiredMonthlyLimit": 50000000,
- "description": "Aumento de volume para folha de pagamento",
- "submissionStatus": "PROCESSING",
- "documents": [
- {
- "documentId": "6650abc1234def567890cccc",
- "type": "PROOF_OF_ADDRESS_COMPANY",
- "fileName": "comprovante.pdf",
- "mimeType": "application/pdf",
- "sentToProvider": true
}
], - "createdAt": "2026-08-06T12:00:00.000Z",
- "updatedAt": "2026-08-06T12:00:00.000Z"
}Step 2 of the monthly limit-increase flow: opens the request with the
supporting documents (comprovantes) already uploaded through
POST /api/v1/stablecoin/limit/document.
Each document is checked before the request is persisted: it must live in the company's own storage prefix, must actually have been uploaded, must be within the size ceiling and must carry an accepted content type.
The push to the KYB provider runs in the background — the response comes
back with submissionStatus: PROCESSING. Poll
GET /api/v1/stablecoin/limit/request/{limitRequestId} until it flips to
SENT or FAILED.
The request raises the ceiling of the account the AppID answers for
(companyBankAccountId in the response). A company that holds several
accounts — a BaaS partner holds one per sub-merchant, each with its own
KYB — asks for each one separately, with that account's AppID.
Only one request per account can be under review at a time; while it is
IN_REVIEW, extra documents go to
POST /api/v1/stablecoin/limit/request/{limitRequestId}/document. The
ceiling itself is raised by the analysis team once the documents are
approved — a successful call does not change the limit by itself.
Requires the STABLECOIN_SUBACCOUNT_CREATE scope, the company
STABLECOIN feature and a confirmed stablecoin subaccount.
| desiredMonthlyLimit required | integer Requested monthly limit, in BRL cents. |
| description | string Free-text justification shown to the analyst. |
required | Array of objects (StablecoinLimitDocumentRef) [ 1 .. 10 ] items |
{- "desiredMonthlyLimit": 50000000,
- "description": "Aumento de volume para folha de pagamento",
- "documents": [
- {
- "type": "PROOF_OF_FINANCIAL_CAPACITY",
- "bucketName": "woovi-media",
- "path": "stablecoin/limit-request/6650abc1234def567890aaaa/8f1c-extrato.pdf",
- "fileName": "extrato.pdf",
- "mimeType": "application/pdf"
}, - {
- "type": "PROOF_OF_ADDRESS_COMPANY",
- "bucketName": "woovi-media",
- "path": "stablecoin/limit-request/6650abc1234def567890aaaa/2b7d-endereco-empresa.pdf",
- "fileName": "endereco-empresa.pdf",
- "mimeType": "application/pdf"
}, - {
- "type": "PROOF_OF_ADDRESS_UBO",
- "bucketName": "woovi-media",
- "path": "stablecoin/limit-request/6650abc1234def567890aaaa/91ae-endereco-socio.pdf",
- "fileName": "endereco-socio.pdf",
- "mimeType": "application/pdf"
}
]
}{- "limitRequestId": "6650abc1234def567890bbbb",
- "companyBankAccountId": "6650abc1234def567890dddd",
- "status": "IN_REVIEW",
- "desiredMonthlyLimit": 50000000,
- "description": "Aumento de volume para folha de pagamento",
- "submissionStatus": "PROCESSING",
- "documents": [
- {
- "documentId": "6650abc1234def567890cccc",
- "type": "PROOF_OF_ADDRESS_COMPANY",
- "fileName": "comprovante.pdf",
- "mimeType": "application/pdf",
- "sentToProvider": true
}
], - "createdAt": "2026-08-06T12:00:00.000Z",
- "updatedAt": "2026-08-06T12:00:00.000Z"
}Returns this company's limit-increase requests, newest first (up to 20).
Requires the STABLECOIN_SUBACCOUNT_LIST scope and the company
STABLECOIN feature.
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/stablecoin/limit/request', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "status": "ok",
- "limitRequests": [
- {
- "limitRequestId": "6650abc1234def567890bbbb",
- "companyBankAccountId": "6650abc1234def567890dddd",
- "status": "IN_REVIEW",
- "desiredMonthlyLimit": 50000000,
- "description": "Aumento de volume para folha de pagamento",
- "submissionStatus": "PROCESSING",
- "documents": [
- {
- "documentId": "6650abc1234def567890cccc",
- "type": "PROOF_OF_ADDRESS_COMPANY",
- "fileName": "comprovante.pdf",
- "mimeType": "application/pdf",
- "sentToProvider": true
}
], - "createdAt": "2026-08-06T12:00:00.000Z",
- "updatedAt": "2026-08-06T12:00:00.000Z"
}
]
}Approves a payout previously created with POST /api/v1/stablecoin/payout.
Identified by correlationId only. Refreshes the provider quote (tokens
expire quickly), opens the ticket (debits INTERNAL float and sends BRL via
Pix), and moves the payout to PROCESSING.
Same two-step pattern as deposit approve (POST /deposit/approve).
Requires the STABLECOIN_PAYOUT_CREATE scope.
| correlationId required | string The |
{- "correlationId": "payout-001"
}{- "status": "PROCESSING",
- "correlationId": "string",
- "payoutId": "string"
}Returns the current state of a payout created through
POST /api/v1/stablecoin/payout.
While the payout is still in flight the provider ticket is re-read and the payout is updated before responding. Terminal payouts are served from storage.
Requires the STABLECOIN_PAYOUT_CREATE scope.
| payoutId required | string The |
{- "status": "PENDING",
- "payoutId": "string",
- "correlationId": "string",
- "ticketId": "string",
- "subAccountId": "string",
- "pixKey": "string",
- "brCode": "string",
- "pixKeyOwner": {
- "name": "string",
- "taxId": "string",
- "bankName": "string"
}, - "endToEndId": "string",
- "failureReason": "string",
- "isRefunded": false,
- "refund": {
- "status": "CONFIRMED",
- "amount": 1699,
- "currency": "BRLA",
- "destination": "SUBACCOUNT_BALANCE",
- "providerTicketId": "string",
- "originalProviderTicketId": "string",
- "reason": "payout reversed - original ticket id: 018f2b2c-...",
- "refundEndToEndId": "string",
- "failureReason": "string",
- "refundedAt": "2019-08-24T14:15:22Z"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "quote": {
- "inputAmount": 16.99,
- "inputCurrency": "BRLA",
- "outputAmount": 16.99,
- "outputCurrency": "BRL",
- "rate": 0,
- "fee": 0
}
}With correlationId, returns the single payout created under that
idempotency key — the same body as
GET /api/v1/stablecoin/payout/{payoutId}.
Without it, lists the authenticated company's payouts, newest first.
The list is served from storage: unlike the single-payout call it does not re-read the provider ticket, so a payout still in flight is as fresh as the last webhook or status read. Read an individual payout to force a sync.
isRefunded tells a settled payout that came back from one that did not.
A returned payout keeps status: COMPLETED — the Pix did leave — so the
status alone never reveals the return. Whether the money is usable again is
refund.status (CONFIRMED = spendable, FAILED = needs reconciliation),
not the flag.
Requires the STABLECOIN_PAYOUT_CREATE scope.
| correlationId | string The idempotency key sent on create. Returns a single payout instead of a list. |
| status | string Enum: "PENDING" "PROCESSING" "COMPLETED" "FAILED" Only payouts in this status. |
| isRefunded | string Enum: "true" "false"
|
| start | string <date-time> Only payouts created at or after this ISO date. |
| end | string <date-time> Only payouts created at or before this ISO date. |
| skip | integer [ 0 .. 10000 ] Default: 0 Documents to skip. Capped at 10000 — page deeper with |
| limit | integer [ 1 .. 100 ] Default: 100 Page size. Values above 100 are capped at 100. |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/stablecoin/payout?correlationId=SOME_STRING_VALUE&status=SOME_STRING_VALUE&isRefunded=SOME_STRING_VALUE&start=SOME_STRING_VALUE&end=SOME_STRING_VALUE&skip=SOME_INTEGER_VALUE&limit=SOME_INTEGER_VALUE', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "status": "ok",
- "payouts": [
- {
- "status": "PENDING",
- "payoutId": "string",
- "correlationId": "string",
- "ticketId": "string",
- "subAccountId": "string",
- "pixKey": "string",
- "brCode": "string",
- "pixKeyOwner": {
- "name": "string",
- "taxId": "string",
- "bankName": "string"
}, - "endToEndId": "string",
- "failureReason": "string",
- "isRefunded": false,
- "refund": {
- "status": "CONFIRMED",
- "amount": 1699,
- "currency": "BRLA",
- "destination": "SUBACCOUNT_BALANCE",
- "providerTicketId": "string",
- "originalProviderTicketId": "string",
- "reason": "payout reversed - original ticket id: 018f2b2c-...",
- "refundEndToEndId": "string",
- "failureReason": "string",
- "refundedAt": "2019-08-24T14:15:22Z"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "quote": {
- "inputAmount": 16.99,
- "inputCurrency": "BRLA",
- "outputAmount": 16.99,
- "outputCurrency": "BRL",
- "rate": 0,
- "fee": 0
}
}
], - "pageInfo": {
- "skip": 0,
- "limit": 0,
- "hasPreviousPage": true,
- "hasNextPage": true
}
}Converts a stablecoin balance held on the company's INTERNAL float into
BRL and sends it to the given Pix key. Supported debit assets:
USDT, USDC, BRLA.
value is the target Pix amount in BRL cents (ex.: 10000 = R$ 100,00).
The INTERNAL debit in currency is taken from the provider quote.
The subaccount is resolved from the Application's companyBankAccount,
same as the wallets endpoint.
Flow (same two-step pattern as deposit): quote (fixed BRL) → balance
check → consume Woovi OUT limit (BRL cents) → resolve Pix beneficiary
→ persist as PENDING. Call POST /api/v1/stablecoin/payout/approve to
open the provider ticket and move to PROCESSING.
Fund the INTERNAL float first via
GET /api/v1/stablecoin/wallets (send USDT/USDC/BRLA on-chain to a returned
address), then call this endpoint.
Idempotency is supported via correlationId: reusing one returns the payout
already created for it.
Requires the STABLECOIN_PAYOUT_CREATE scope.
| value required | number >= 1 Target Pix amount in BRL cents (ex. 10000 = R$ 100,00). |
| currency required | string Enum: "USDT" "USDC" "BRLA" INTERNAL float asset to debit (amount from quote). |
| pixKey required | string Destination Pix key. |
| correlationId | string or null Optional idempotency key echoed back on the response. |
| pixMessage | string or null Optional Pix message sent with the transfer. |
{- "value": 10000,
- "currency": "USDC",
- "pixKey": "13d3109f-3a1e-4c56-b76d-d2db7213b9f2",
- "correlationId": "string",
- "pixMessage": "string"
}{- "status": "PENDING",
- "payoutId": "string",
- "correlationId": "string",
- "pixKey": "string",
- "pixKeyOwner": {
- "name": "string",
- "taxId": "string",
- "bankName": "string"
}, - "quote": {
- "inputAmount": 0,
- "inputCurrency": "string",
- "outputAmount": 0,
- "outputCurrency": "BRL",
- "rate": 0,
- "fee": 0
}
}Returns a quote for delivering a target BRL amount via Pix, debiting
INTERNAL float (USDT / USDC / BRLA). The fixed side is BRL; the
response inputAmount is how much of currency will be spent.
value is the target Pix amount in BRL cents (ex.: 10000 = R$ 100,00).
The Woovi fee (STABLE_PAYOUT_FEE, priced from the AppID bank account's stable payout
fee settings) is reported as wooviFee. It is a SEPARATE BRL debit charged when the
payout is approved — it is never deducted from outputAmount, so the total cost of the
payout is outputAmount worth of float plus wooviFee in BRL. It comes back null
when the fee service cannot price it; the payout itself still goes through.
Requires the STABLECOIN_PAYOUT_CREATE scope.
| value required | number >= 1 Example: value=10000 Target Pix amount in BRL cents (ex. 10000 = R$ 100,00). |
| currency required | string Enum: "USDT" "USDC" "BRLA" Example: currency=USDC INTERNAL float asset to debit (amount returned on the quote). |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/stablecoin/payout/quote?value=10000¤cy=USDC', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "status": "ok",
- "quote": {
- "basePrice": 0,
- "inputAmount": 0,
- "inputCurrency": "string",
- "outputAmount": 0,
- "outputCurrency": "BRL",
- "wooviFee": 0.5,
- "providerFee": 0.5,
- "fee": 1,
- "appliedFees": [
- {
- "type": "Out Fee",
- "amount": 0.5,
- "currency": "BRL"
}
], - "pairName": "string"
}
}Returns a PIX (BRL) -> stablecoin quote without creating a deposit, broken down into BOTH fees: the Woovi fee (priced from the AppID bank account's stable deposit fee settings, including its configured minimum) and the provider fee. Use it to display the exact amount of stablecoin the customer would receive, and the exact BRL that leaves the account, before confirming.
The amount field you send picks the fee model, exactly as in
POST /api/v1/stablecoin/deposit:
grossAmount (recommended): all-in. The Woovi fee comes OUT of it, so
grossAmount is what the account is debited and inputAmount is what the
provider is quoted over.value (legacy): the amount paid to the provider, with the Woovi fee charged ON
TOP — the account is debited grossAmount = value + wooviFee.BRL-denominated assets (BRLA) are charged the configured MINIMUM Woovi fee only: the percentage is meaningless against a BRL value, so it never scales with the amount.
The AppID must have a companyBankAccount configured, otherwise the fee cannot be
priced and the request is rejected with 400 APPLICATION_COMPANY_BANK_ACCOUNT_MISSING. A quote is never returned without the
Woovi fee — that would under-report what the customer pays.
The provider leg is cached for 60 seconds.
Requires the STABLECOIN_DEPOSIT_CREATE scope.
| value | number >= 1 Example: value=10000 Legacy model: amount paid to the provider, in cents (BRL), with the Woovi fee
charged on top. Send this or |
| grossAmount | number >= 1 Example: grossAmount=10000 All-in model: total to debit, in cents (BRL). The Woovi fee comes out of it. Send
this or |
| currency | string Default: "USDT" Enum: "USDT" "USDC" "BRLA" Example: currency=USDT Stablecoin to receive. Defaults to USDT. |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/stablecoin/quote?value=10000&grossAmount=10000¤cy=USDT', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "status": "ok",
- "quote": {
- "basePrice": 5.25,
- "inputAmount": 100,
- "grossAmount": 102,
- "inputCurrency": "BRL",
- "outputAmount": 19.04,
- "fee": 3.5,
- "wooviFee": 2,
- "providerFee": 1.5,
- "effectivePrice": 5.36,
- "outputCurrency": "USDT",
- "appliedFees": [
- {
- "type": "In Fee",
- "amount": 1.5,
- "currency": "BRL"
}
], - "pairName": "BRL/USDT"
}
}Returns the provider's INTERNAL balance per asset for this subaccount —
exactly the balance POST /api/v1/stablecoin/payout debits.
Poll this after sending funds to one of the addresses from
GET /api/v1/stablecoin/wallets (or the subaccount wallets route) and only
create the payout once the credit has landed.
Only subaccounts belonging to the authenticated company resolve; any other
id returns 404.
Requires the STABLECOIN_SUBACCOUNT_LIST scope.
| subAccountId required | string Provider subaccount id ( |
{- "status": "ok",
- "subAccountId": "string",
- "balances": {
- "BRLA": 1250.35,
- "USDC": 0.2,
- "USDT": 0
}
}Fetches a single stablecoin subaccount for the authenticated company by its provider
subAccountId.
Returns 404 when no subaccount with that subAccountId exists for the company.
Requires the STABLECOIN_SUBACCOUNT_LIST scope.
| subAccountId required | string non-empty The provider subaccount id. |
{- "status": "ok",
- "subAccount": {
- "id": "6650abc1234def567890aaaa",
- "subAccountId": "sub_01HZ...",
- "account": "6650def1234abc567890bbbb",
- "createdAt": "2026-06-05T12:00:00.000Z"
}
}Status of the USD rail on the company's CONFIRMED stablecoin subaccount:
how far its KYB USD got and whether the provider currently accepts a USD
ticket for it.
Poll this after POST /api/v1/stablecoin/subaccount/kyb/usd — the
submission only creates the attempt, and the verdict lands later. While
the attempt can still change verdict the stored status is reconciled with
the provider on every read, so a rejection shows up here as soon as the
provider has it.
usdUnlocked is the field that actually gates the rail: an APPROVED
attempt alone is not enough, and it never turns true in the provider
sandbox.
Requires the STABLECOIN_SUBACCOUNT_LIST scope and the company
STABLECOIN feature.
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/stablecoin/subaccount/kyb/usd', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "status": "ok",
- "usdKyb": {
- "subAccountId": "sub_01HZ...",
- "status": "NOT_REQUESTED",
- "usdUnlocked": false
}
}Unlocks the USD fiat rail on a company stablecoin subaccount that already has
KYB Level 1 approved (StableSubAccount.status = CONFIRMED).
The call uploads the supporting documents to the provider, submits Proof of
Financial Capacity (and waits until it is APPROVED), optionally submits a
company Proof of Address, then submits the KYB USD attempt.
Document URLs must be publicly fetchable (or pre-signed) HTTPS links to the PDF/image files. Typical sources: files already uploaded during onboarding / RFI, or merchant-hosted temporary URLs.
Required documents:
proofOfFinancialCapacityUrl — proof of financial capacity (PoFC)proofOfRevenueUrl — proof of revenueOptional documents:
proofOfAddressCompanyUrl — company proof of address (raises limits;
independent of the USD rail, but accepted in the same call)Also required:
businessType — Bridge business type enumbusinessIndustries — at least one industry from the
StablecoinSubAccountKybUsdIndustry enum (e.g. SOFTWARE; OTHER
when none fits)website — required only when the company website was not captured at
KYB Level 1The subaccount must belong to the authenticated company and be CONFIRMED.
Requires the STABLECOIN_SUBACCOUNT_CREATE scope and the company
STABLECOIN feature.
The call is synchronous and waits on the provider: it can take up to two
minutes, and answers 504 when the Proof of Financial Capacity is still
not approved by then (the document ids come back, so nothing has to be
re-uploaded).
A 201 only means the attempt was created — poll
GET /api/v1/stablecoin/subaccount/kyb/usd for the verdict and for
usdUnlocked.
Note: USD fiat rails are not available in the provider sandbox — submission
may appear to succeed, but usdUnlocked will not become true there.
| subAccountId required | string Provider subaccount id that already completed KYB Level 1. |
| businessType required | string Enum: "cooperative" "corporation" "llc" "other" "partnership" "sole_prop" "trust" Bridge business type for the USD rail. |
| businessIndustries required | Array of strings (StablecoinSubAccountKybUsdIndustry) non-empty unique Items Enum: "SOFTWARE" "ECOMMERCE" "PROFESSIONAL_SERVICES" "MARKETING" "FOOD" "HEALTH" "EDUCATION" "LOGISTICS" "CONSTRUCTION" "FINANCIAL" "OTHER" Industries the company operates in. At least one is required. Pick from the enum — the API maps each id to the provider's industry code; when none fits, send |
| website | string <uri> Company website. Required only when it was not captured at KYB Level 1. |
| proofOfRevenueUrl required | string <uri> HTTPS URL of the proof-of-revenue document (PDF/image). Downloaded by the API and uploaded to the provider as |
| proofOfFinancialCapacityUrl required | string <uri> HTTPS URL of the proof-of-financial-capacity document (PDF/image). Uploaded as |
| proofOfAddressCompanyUrl | string <uri> Optional HTTPS URL of the company proof-of-address document (PDF/image). Uploaded as |
{- "subAccountId": "sub_01HZ...",
- "businessType": "llc",
- "businessIndustries": [
- "OTHER"
],
}{- "subAccountId": "sub_01HZ...",
- "usdKybAttemptId": "7d2f5b18-3e9c-4a7f-d246-6b0e1f8d4c52",
- "proofOfRevenueDocId": "5f8d3c16-b2e7-4a9f-c834-1e6b0d5f2a91",
- "proofOfFinancialCapacityDocId": "c4e9b27f-1a3d-4e8c-b561-7d2f0a9e4b38",
- "proofOfFinancialCapacityAttemptId": "1e6b8c43-5f2a-4d9e-b782-4c1f0a7e3b65",
- "proofOfAddressDocId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "proofOfAddressAttemptId": "b2c3d4e5-f6a7-8901-bcde-f12345678901"
}Lists the authenticated company's stablecoin subaccounts, most recent first.
A subaccount is created when the company completes a KYB with the stablecoin provider.
Use this endpoint to discover the subAccountId values available to the company.
Requires the STABLECOIN_SUBACCOUNT_LIST scope.
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/stablecoin/subaccount', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "status": "ok",
- "subAccounts": [
- {
- "id": "6650abc1234def567890aaaa",
- "subAccountId": "sub_01HZ...",
- "account": "6650def1234abc567890bbbb",
- "createdAt": "2026-06-05T12:00:00.000Z"
}
]
}Requests a stablecoin subaccount (KYB) for the company behind your AppID, reusing the KYC data already on its account register.
The body can be empty — the target account is resolved from the
credentials. Send accountRegisterId only to target another account
register of the same company (a BaaS partner asking for one of its
sub-merchants), and companyBankAccountId only to override which account
the subaccount is stamped with.
Every gate runs before the response, so status is the verdict:
status |
Meaning |
|---|---|
IN_REVIEW |
Accepted. The outcome arrives as a STABLECOIN_SUBACCOUNT_CONFIRMED or STABLECOIN_SUBACCOUNT_REJECTED webhook. |
AWAITING_DOCUMENTS |
Documents are missing. Send the merchant to rfi.url; answering it re-runs the KYB. |
REJECTED |
Refused for good — screening, fraud markers, a CNPJ that is not ACTIVE, a refused KYC score. reasonCode says which. |
FAILED |
Blocked by a gap in the account register that only a Woovi operator can fix. Retrying does not help. |
Repeat calls are idempotent on the resolved account register: they return
the existing subaccount with its current verdict (HTTP 200, including an
RFI link that is still open) instead of creating a duplicate. The first,
creating call returns HTTP 201.
Requires the STABLECOIN_SUBACCOUNT_CREATE scope and the company
STABLECOIN feature.
| accountRegisterId | string The account register id whose KYC data backs the KYB. Must belong to the authenticated company. Defaults to the account register of the bank account behind the AppID. |
| companyBankAccountId | string Company bank account to associate with the subaccount. Defaults to the bank account configured on the AppID, then to the company's default bank account. |
{ }{- "subAccountId": "sub_01HZ...",
- "status": "IN_REVIEW",
- "reasonCode": "ACCOUNT_REGISTER_CNPJ_NOT_ACTIVE",
- "reason": "string",
- "accountRegisterId": "6650abc1234def567890aaaa",
- "account": "6650def1234abc567890bbbb",
- "correlationId": "3f1a2b3c-4d5e-6f70-8a9b-0c1d2e3f4a5b"
}Returns the wallets the provider holds for this subaccount. Sending an
asset on-chain to one of these addresses credits the subaccount's INTERNAL
balance — the same balance POST /api/v1/stablecoin/swap spends and
POST /api/v1/stablecoin/withdraw pays out from.
Use this to resolve where to prefund instead of hardcoding an address: funding a different account's wallet leaves the swap float empty and the swap fails for lack of balance.
Only subaccounts belonging to the authenticated company resolve; any other
id returns 404.
Requires the STABLECOIN_SUBACCOUNT_LIST scope.
| subAccountId required | string Provider subaccount id ( |
{- "status": "ok",
- "subAccountId": "string",
- "wallets": [
- {
- "address": "0xbd374a94d88F19b80F6aD8A3AE418e3f1eb054AE",
- "currency": "USDC",
- "network": "POLYGON"
}
]
}Returns the current state of a swap created through
POST /api/v1/stablecoin/swap, so a caller can poll it to completion
instead of replaying the create request with the same correlationId.
While the swap is still in flight (CREATED, PENDING, PROCESSING) the
provider ticket is re-read and the swap is updated before responding, with
at most one provider read every 3 seconds per swap. Terminal swaps
(COMPLETED, FAILED) are served straight from storage.
A FAILED swap carries failureReason with the provider's own reason
whenever it reported one.
Requires the STABLECOIN_SWAP_CREATE scope.
| swapId required | string Example: 6650abc1234def567890aaaa The |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/stablecoin/swap/6650abc1234def567890aaaa', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "status": "COMPLETED",
- "swapId": "string",
- "correlationId": "string",
- "ticketId": "string",
- "subAccountId": "string",
- "network": "string",
- "destinationWalletAddress": "string",
- "txHash": "string",
- "expiration": "string",
- "failureReason": "string",
- "createdAt": "string",
- "updatedAt": "string",
- "quote": {
- "inputAmount": 0,
- "inputCurrency": "USDC",
- "outputAmount": 0,
- "outputCurrency": "BRLA",
- "rate": 0,
- "fee": 0
}
}Same as GET /api/v1/stablecoin/swap/{swapId}, looked up by the
correlationId the caller sent on create. When a correlationId was reused
across several swaps, the most recent one is returned.
Requires the STABLECOIN_SWAP_CREATE scope.
| correlationId required | string The idempotency key sent on create. |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/stablecoin/swap?correlationId=SOME_STRING_VALUE', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "status": "COMPLETED",
- "swapId": "string",
- "correlationId": "string",
- "ticketId": "string",
- "subAccountId": "string",
- "network": "string",
- "destinationWalletAddress": "string",
- "txHash": "string",
- "expiration": "string",
- "failureReason": "string",
- "createdAt": "string",
- "updatedAt": "string",
- "quote": {
- "inputAmount": 0,
- "inputCurrency": "USDC",
- "outputAmount": 0,
- "outputCurrency": "BRLA",
- "rate": 0,
- "fee": 0
}
}Converts a balance from one stablecoin asset into another on the company's
Avenia (sub-)account. Supported assets: BRLA, USDC, USDT.
value is the amount spent from the source (from) asset balance, in cents.
Two output modes, one provider ticket either way:
network / destinationWalletAddress — an
INTERNAL -> INTERNAL conversion. The output stays as a balance on the
sub-account. from and to must be different assets.INTERNAL -> <network> ticket: the output is delivered
on-chain to destinationWalletAddress instead of being credited to the
balance. There is no second call and no second fee: the conversion and
the delivery are quoted and settled as one ticket. In this mode from
and to may be the same asset, which makes the request a plain
on-chain payout with no conversion.The two fields are only meaningful together — sending one without the
other is a 400.
When the subaccount has enforceWalletWhitelist on, an on-chain
destinationWalletAddress must be an approved (network, address) pair;
the request is rejected before any limit is consumed or any provider call
is made. An INTERNAL-only swap moves nothing off-platform and is not
gated by the whitelist.
The company must have a stable subaccount in CONFIRMED status (a completed
KYB). Otherwise the request is rejected with a 400.
Idempotency is supported via correlationId: reusing one returns the swap
already created for it instead of creating a second provider ticket. Always
send one when delivering on-chain — without it a retry sends the funds twice.
Requires the STABLECOIN_SWAP_CREATE scope.
| value required | number >= 1 Amount to swap, in cents of the source asset. |
| from required | string Enum: "USDT" "USDC" "BRLA" Source asset to spend. |
| to required | string Enum: "USDT" "USDC" "BRLA" Destination asset to receive. |
| network | string or null Enum: "POLYGON" "ETHEREUM" "BASE" "CELO" "TRON" "BNB" Deliver the output on this chain instead of crediting the
INTERNAL balance. Must be sent together with
|
| destinationWalletAddress | string or null External address that receives the output. Must be sent
together with |
| subAccountId | string or null Optional Avenia sub-account to swap on. |
| correlationId | string or null Optional idempotency key echoed back on the response. |
{- "value": 100000,
- "from": "BRLA",
- "to": "USDC"
}{- "status": "PENDING",
- "swapId": "string",
- "correlationId": "string",
- "expiration": "string",
- "network": "string",
- "destinationWalletAddress": "string",
- "quote": {
- "inputAmount": 0,
- "inputCurrency": "BRLA",
- "outputAmount": 0,
- "outputCurrency": "USDC",
- "rate": 0,
- "fee": 0
}
}Quotes converting value (in cents of the from asset) into the to
asset without creating a swap. Use it to display the exact output amount
before confirming. Supported assets: BRLA, USDC, USDT.
Pass the same network the swap will use to price the whole thing
through to the chain. The delivery fee and gas only exist on that leg, so
an INTERNAL-only quote understates the cost of a swap that ends on-chain.
Without network, from and to must be different; with one they may
match (a payout with no conversion).
The quote is fetched from the provider and cached for 60 seconds.
Requires the STABLECOIN_SWAP_CREATE scope.
| value required | number >= 1 Example: value=100000 Amount to quote, in cents of the source asset. Must be positive. |
| from required | string Enum: "USDT" "USDC" "BRLA" Example: from=BRLA Source asset to spend. |
| to required | string Enum: "USDT" "USDC" "BRLA" Example: to=USDC Destination asset to receive. |
| network | string Enum: "POLYGON" "ETHEREUM" "BASE" "CELO" "TRON" "BNB" Example: network=BASE Quote the on-chain delivery leg too, instead of stopping at the INTERNAL balance. |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/stablecoin/swap/quote?value=100000&from=BRLA&to=USDC&network=BASE', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "status": "ok",
- "quote": {
- "basePrice": 0,
- "inputAmount": 0,
- "inputCurrency": "BRLA",
- "outputAmount": 0,
- "outputCurrency": "USDC",
- "network": "string",
- "appliedFees": [
- {
- "type": "string",
- "amount": 0,
- "currency": "string"
}
], - "pairName": "BRLA/USDC"
}
}Returns the deposit addresses for the stable sub-account linked to the
authenticated Application's companyBankAccount (live from the provider —
not stored in Mongo).
A company can have more than one bank account / KYB sub-account. The
sub-account is resolved from Application.companyBankAccount (the
account bound to the AppID), not from the company alone.
Sending an asset on-chain to one of these addresses credits the INTERNAL
float used by POST /api/v1/stablecoin/payout (USDT/USDC/BRLA → Pix).
For an explicit provider id use
GET /api/v1/stablecoin/subaccount/{subAccountId}/wallets.
To read the float balance after funding use
GET /api/v1/stablecoin/subaccount/{subAccountId}/balances.
Requires the STABLECOIN_SUBACCOUNT_LIST scope.
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/stablecoin/wallets', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "status": "ok",
- "companyBankAccountId": "string",
- "subAccountId": "string",
- "wallets": [
- {
- "address": "string",
- "currency": "string",
- "network": "string"
}
]
}Withdraw from a Sub Account and return the withdrawal transaction information
| id required |
Data to make a withdraw partial
| value | number Value of the withdrawal in cents if want to make a partial withdrawal |
{- "value": 1000
}{- "transaction": {
- "status": "CREATED",
- "value": 100,
- "endToEndId": "ENDTOENDID_1234567890",
- "correlationID": "TESTING1323",
- "comment": "testing-transaction"
}
}Deletes a Sub Account if it has no remaining balance
| id required |
const http = require('https'); const options = { method: 'DELETE', hostname: 'api.woovi.com', port: null, path: '/api/v1/subaccount/[email protected]', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "status": "OK",
- "pixKey": "[email protected]"
}| id required | string Examples:
pix key registered to the subaccount |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/subaccount/c4249323-b4ca-43f2-8139-8232aab09b93', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "SubAccount": {
- "name": "test-sub-account",
- "pixKey": "c4249323-b4ca-43f2-8139-8232aab09b93",
- "balance": 100,
- "withdrawBlocked": false
}
}const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/subaccount', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "subAccounts": [
- {
- "name": "test-sub-account",
- "pixKey": "c4249323-b4ca-43f2-8139-8232aab09b93",
- "balance": 100,
- "withdrawBlocked": false
}
], - "pageInfo": {
- "skip": 0,
- "limit": 10,
- "hasPreviousPage": false,
- "hasNextPage": true
}
}Data to create a new subAccount or retrieve existing one
| pixKey | string The pix key for the sub account |
| name | string Name of the sub account |
{- "pixKey": "9134e286-6f71-427a-bf00-241681624587",
- "name": "Test Account"
}{- "SubAccount": {
- "name": "test-sub-account",
- "pixKey": "c4249323-b4ca-43f2-8139-8232aab09b93"
}
}Transfers the amount from the main account to the subaccount.
| id required |
| value required | number Amount to credit to the account |
| description | string Optional description for the credit operation |
{- "value": 100,
- "description": "Monthly deposit"
}{- "value": 100,
- "description": "Monthly deposit",
- "success": "Sub-account withdrawal has been successfully credited, 100"
}Transfers the amount from the subaccount to the main account.
| id required |
| value required | number Amount to debit from the account |
| description | string Optional description for the debit operation |
{- "value": 50,
- "description": "Monthly payment"
}{- "value": 50,
- "description": "Monthly payment",
- "success": "Sub-account withdrawal has been successfully debited, 50"
}Transfer between subaccounts
Data to make a new transfer between subaccounts
| value required | number The value of the transfer in cents |
| fromPixKey required | string The transfer origin pix key |
| fromPixKeyType required | string Enum: "CPF" "CNPJ" "EMAIL" "PHONE" "RANDOM" The transfer origin pix key type |
| toPixKey required | string The transfer destination pix key |
| toPixKeyType required | string Enum: "CPF" "CNPJ" "EMAIL" "PHONE" "RANDOM" The transfer destination pix key type |
| correlationID | string Your correlation ID to keep track of this transfer |
{- "value": 65,
- "fromPixKey": "c4249323-b4ca-43f2-8139-874baab09b93",
- "fromPixKeyType": "RANDOM",
- "toPixKey": "3143da48-2bc7-49a4-89bd-4e22f73bfb0c",
- "toPixKeyType": "RANDOM"
}{- "value": 65,
- "destinationSubaccount": {
- "name": "test-sub-account-1",
- "pixKey": "c4249323-b4ca-43f2-8139-874baab09b93",
- "balance": 100
}, - "originSubaccount": {
- "name": "test-sub-account-2",
- "pixKey": "3143da48-2bc7-49a4-89bd-4e22f73bfb0c",
- "balance": 100
}
}Returns the ledger entries (statement) for a specific subaccount.
| id required |
| skip | integer >= 0 Number of entries to skip for pagination |
| limit | integer >= 1 Example: limit=20 Maximum number of entries to return |
| start | string <date-time> Example: start=2023-01-01T00:00:00.000Z Start date for filtering entries (ISO 8601 format) |
| end | string <date-time> Example: end=2023-12-31T23:59:59.999Z End date for filtering entries (ISO 8601 format) |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/subaccount/[email protected]/statement?skip=0&limit=20&start=2023-01-01T00%3A00%3A00.000Z&end=2023-12-31T23%3A59%3A59.999Z', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
[- {
- "id": "507f1f77bcf86cd799439011",
- "time": "2023-12-01T10:30:00.000Z",
- "description": "Payment received from customer",
- "balance": 1500,
- "value": 100,
- "type": "CREDIT",
- "operationType": "CREDIT"
}
]| id required | string Example: UGF5bWVudFN1YnNjcmlwdGlvbjo2M2UzYjJiNzczZDNkOTNiY2RkMzI5OTM= The globalID of the installment or the endToEndId from transaction. |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/installments/UGF5bWVudFN1YnNjcmlwdGlvbjo2M2UzYjJiNzczZDNkOTNiY2RkMzI5OTM=', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "installment": {
- "dateGenerateCharge": "2019-08-24T14:15:22Z",
- "expiration": 0,
- "installmentNumber": 0,
- "value": 0,
- "status": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "cobr": {
- "identifierId": "string",
- "recurrencyId": "string",
- "installmentId": "string",
- "endToEndId": "string",
- "rejectCode": "string",
- "status": "string",
- "value": 0,
- "tries": [
- {
- "tryStatus": "string",
- "finalityPurpose": "string",
- "rejectCode": "string",
- "value": 0,
- "requestedExecutionDate": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
], - "paymentDate": "string",
- "chargeDate": "string",
- "expiryDate": "string",
- "description": "string",
- "createdAt": "string"
}, - "paymentSubscriptionGlobalID": "string",
- "correlationID": "string",
- "globalID": "string"
}
}| id required | string Example: UGF5bWVudFN1YnNjcmlwdGlvbjo2M2UzYjJiNzczZDNkOTNiY2RkMzI5OTM= The globalID of the subscription. |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/subscriptions/UGF5bWVudFN1YnNjcmlwdGlvbjo2M2UzYjJiNzczZDNkOTNiY2RkMzI5OTM=/installments', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "installments": [
- {
- "dateGenerateCharge": "2019-08-24T14:15:22Z",
- "expiration": 0,
- "installmentNumber": 0,
- "value": 0,
- "status": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "cobr": {
- "identifierId": "string",
- "recurrencyId": "string",
- "installmentId": "string",
- "endToEndId": "string",
- "rejectCode": "string",
- "status": "string",
- "value": 0,
- "tries": [
- {
- "tryStatus": "string",
- "finalityPurpose": "string",
- "rejectCode": "string",
- "value": 0,
- "requestedExecutionDate": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
], - "paymentDate": "string",
- "chargeDate": "string",
- "expiryDate": "string",
- "description": "string",
- "createdAt": "string"
}, - "paymentSubscriptionGlobalID": "string",
- "correlationID": "string",
- "globalID": "string"
}
], - "pageInfo": {
- "errors": [
- {
- "message": "string",
- "data": {
- "skip": 0,
- "limit": 0
}
}
], - "skip": 0,
- "limit": 0,
- "hasPreviousPage": true,
- "hasNextPage": true
}
}| id required | string Example: UGF5bWVudFN1YnNjcmlwdGlvbjo2M2UzYjJiNzczZDNkOTNiY2RkMzI5OTM= The globalID or correlationID of the subscription. |
const http = require('https'); const options = { method: 'PUT', hostname: 'api.woovi.com', port: null, path: '/api/v1/subscriptions/UGF5bWVudFN1YnNjcmlwdGlvbjo2M2UzYjJiNzczZDNkOTNiY2RkMzI5OTM=/cancel', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{ }| id required | string Example: UGF5bWVudFN1YnNjcmlwdGlvbjo2M2UzYjJiNzczZDNkOTNiY2RkMzI5OTM= The globalID or correlationID of the subscription. |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/subscriptions/UGF5bWVudFN1YnNjcmlwdGlvbjo2M2UzYjJiNzczZDNkOTNiY2RkMzI5OTM=', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "subscription": {
- "globalID": "UGF5bWVudFN1YnNjcmlwdGlvbjo2M2UzYjJiNzczZDNkOTNiY2RkMzI5OTM=",
- "customer": {
- "name": "Dan",
- "phone": "5511999999999",
- "taxID": {
- "taxID": "31324227036",
- "type": "BR:CPF"
}
}, - "value": 100,
- "dayGenerateCharge": 5,
- "correlationID": "subscription#1",
- "status": "ACTIVE"
}
}const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/subscriptions', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "pageInfo": {
- "skip": 0,
- "limit": 10,
- "hasPreviousPage": false,
- "hasNextPage": true
}
}Endpoint to create a new Subcription
Data to create a new Subscription
required | object Customer of this subscription |
| value required | number Value in cents of this subscription |
| name | string Name of the subscription |
| comment | string Comment to be show in QR Code |
number or string | |
| frequency | string Enum: "WEEKLY" "MONTHLY" "BIMONTHLY" "QUARTERLY" "SEMIANNUALLY" "ANNUALLY" Frequency of the subscription — the interval between charges (defaults to
|
| type required | string Enum: "PIX_RECURRING" "RECURRENT" Type of the subscription |
| dayDue | number >= 3 Default: 7 Days that the charge will take to expire from the generation day. |
| installmentCount | number number of installments (optional) |
| correlationID required | string Your correlation ID to keep track of this subscription |
Array of objects | |
object Pix automatic options | |
| chargeType | string Enum: "DYNAMIC" "OVERDUE" "BOLETO" Charge method used for each charge generated by the subscription (defaults to
|
{- "name": "Pix Automático",
- "value": 100,
- "customer": {
- "name": "Dan",
- "taxID": "31324227036",
- "phone": "5511999999999",
- "address": {
- "zipcode": "04556300",
- "street": "rua de são paulo",
- "number": "3432",
- "neighborhood": "BROOKLIN PAULISTA",
- "city": "SAO PAULO",
- "state": "SP",
- "complement": "CONJ 26"
}
}, - "correlationID": "My-UniqueID",
- "comment": "Comentários",
- "frequency": "WEEKLY",
- "type": "PIX_RECURRING",
- "pixRecurringOptions": {
- "journey": "ONLY_RECURRENCY",
- "retryPolicy": "NON_PERMITED"
}, - "dayGenerateCharge": 25,
- "dayDue": 3
}{- "subscription": {
- "customer": {
- "name": "Dan",
- "phone": "+5511999999999",
- "address": {
- "zipcode": "04556300",
- "street": "rua de são paulo",
- "number": "3432",
- "neighborhood": "BROOKLIN PAULISTA",
- "city": "SAO PAULO",
- "state": "SP",
- "complement": "CONJ 26",
- "country": "BR",
- "location": {
- "coordinates": [ ]
}, - "_id": "68acbcd4a95653ef243b66eb"
}, - "taxID": {
- "taxID": "31324227036",
- "type": "BR:CPF"
}, - "correlationID": "6f4131ea-b816-4b08-8ba6-11cf6b622a6e"
}, - "dayGenerateCharge": 25,
- "value": 100,
- "status": "ACTIVE",
- "correlationID": "My-UniqueID",
- "pixRecurring": {
- "recurrencyId": "RN5481141720250825yPWxVcFfpA1",
- "emv": "00020101021226870014br.gov.bcb.pix2565qr-h.woovi.digital/qr/v2/cob/faabf55e-8000-40e2-80d8-9651749a6abb5204000053039865802BR5911Pedro Woovi6007VITORIA62070503***80870014br.gov.bcb.pix2565qr-h.woovi.digital/qr/v2/rec/fb59c6eb-fb99-4ff6-8f4c-17e2cd042c346304FE57",
- "journey": "ONLY_RECURRENCY",
- "status": "CREATED"
}, - "globalID": "UGF5bWVudFN1YnNjcmlwdGlvbjo2OGFjYmNkNGE5NTY1M2VmMjQzYjY2Zjc="
}
}Builds the payment book (carnê) of a subscription as a PDF — one slip per
installment, in a single request, up to the month/year you ask for.
Only for type: RECURRENT subscriptions. Pix Automático
(PIX_RECURRING) has no payment book: there the payer's bank executes each
charge on its own date, so the charges cannot be brought forward into a
document. Asking for the payment book of a Pix Automático subscription is
answered with 400.
A subscription's future installments do not exist as charges yet — each one is created close to its own due date. Printing a booklet brings that forward.
The call is synchronous and creates every missing charge in the period. Nothing is queued and there is no ticket to poll: it walks the installments up to the cutoff you asked for, creates the charge of each one that does not have it, and answers only once the PDF is ready. Response time is therefore much longer than a normal call, and grows with the number of charges to create — a long booklet asked for the first time is the worst case, because none of its installments exist yet. Raise your client's timeout before asking for a long period; the default in most HTTP libraries is too short for this.
Those charges are real: they show on your statement, fire the usual webhooks
when paid, and follow your account's commercial terms, including any boleto
issuing fee that applies to it. So treat it as a write even though it is a
GET: do not put it behind a blind retry, a link prefetch or a monitoring
check, and ask only for the period you are going to hand to the customer.
month and year are required and reach at most the end of next year. There
is no default — the pair decides how many charges are created, so the caller
states it.
Repeating the request is safe: an installment that already has a charge does not get a second one, so a reprint costs nothing and widening the window creates only the difference. That is also the recovery if your client times out — call the same URL again.
The booklet carries a slip for each in-range installment that is still open. Installments already paid or expired are left out, so it never invites paying the same one twice — which is why the slip count can be lower than the number of installments in the period.
| id required | string Example: UGF5bWVudFN1YnNjcmlwdGlvbjo2M2UzYjJiNzczZDNkOTNiY2RkMzI5OTM= The |
| month required | integer [ 1 .. 12 ] Example: month=12 Last month the booklet reaches, |
| year required | integer Example: year=2027 Last year the booklet reaches. Required, and limited to the current year
or the next one — a later year is answered with |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/subscriptions/UGF5bWVudFN1YnNjcmlwdGlvbjo2M2UzYjJiNzczZDNkOTNiY2RkMzI5OTM=/payment-book?month=12&year=2027', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "error": "O carnê exige o mês e o ano até onde gerar"
}| id required | string Example: UGF5bWVudFN1YnNjcmlwdGlvbjo2M2UzYjJiNzczZDNkOTNiY2RkMzI5OTM= The globalID or correlationID of the subscription. |
const http = require('https'); const options = { method: 'PUT', hostname: 'api.woovi.com', port: null, path: '/api/v1/subscriptions/UGF5bWVudFN1YnNjcmlwdGlvbjo2M2UzYjJiNzczZDNkOTNiY2RkMzI5OTM=/value', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{ }Create a new Cobr Manually.
| id required | string Example: UGF5bWVudFN1YnNjcmlwdGlvbjo2M2UzYjJiNzczZDNkOTNiY2RkMzI5OTM= The globalID of the installment. |
Data to create a new Cobr
| value | number Valor da cobrança (Opcional) |
{- "value": 0
}{ }Create a new Retry Manually.
| id required | string Example: UGF5bWVudFN1YnNjcmlwdGlvbjo2M2UzYjJiNzczZDNkOTNiY2RkMzI5OTM= The globalID of the installment. |
Data to create a new Cobr
| value | number Valor da cobrança (Opcional) |
{- "value": 0
}{ }Endpoint to to transfer values between accounts
Data to create a transfer
| value | number value of the transfer in cents |
| fromPixKey | string the pix key of the account the value of the transfer will come out from |
| toPixKey | string the pix key of the account the value of the transfer will go to |
| correlationID | string your correlation ID to keep track of this transfer |
{- "value": 100,
- "correlationID": "123e4567-e89b-12d3-a456-426614174000"
}{- "transaction": {
- "value": 100,
- "time": "2023-06-22T15:33:27.165Z,",
- "correlationID": "c782e0ac-833d-4a89-9e73-9b60b2b41d3a"
}
}The blockings on a bank account changed. Requires the SEND_WEBHOOK_TO_BLOCK_COMPANY_BANK_ACCOUNT feature.
| event required | string Value: "COMPANY_BANK_ACCOUNT_BLOCKED" |
object | |
| blockings | Array of strings Items Enum: "PIX_IN" "PIX_OUT" "PIX_REFUND_SENT" "PIX_REFUND_RECEIVED" "PIX_OUT_BLOCK_THIRD_PARTY_CNPJ" "PIX_IN_BLOCK_THIRD_PARTY_CNPJ" "PIX_OUT_BLOCK_THIRD_PARTY_CPF" "BOLETO_OUT" "PIX_OUT_ALLOW_LIST_ONLY" "INTERNAL_TRANSFER_OUT" "INTERNAL_TRANSFER_IN" "PIX_REFUND" |
{- "event": "COMPANY_BANK_ACCOUNT_BLOCKED",
- "account": {
- "accountId": "6710e8b0c93f0d0012f5a1b2",
- "account": "1234567",
- "officialName": "ACME LTDA",
- "tradeName": "ACME",
- "taxID": {
- "taxID": "44720743000101",
- "type": "BR:CNPJ"
}
}, - "blockings": [
- "PIX_OUT"
]
}A sub-account register was approved by compliance and the account can transact.
| event required | string Value: "ACCOUNT_REGISTER_APPROVED" |
object | |
object |
{- "event": "ACCOUNT_REGISTER_APPROVED",
- "accountRegister": {
- "officialName": "Test Company",
- "taxID": {
- "taxID": "12345678901234",
- "type": "BR:CNPJ"
}, - "status": "APPROVED"
}, - "account": {
- "status": "OPEN",
- "accountId": "68dbe391ee9fce4ba2b0b4ec",
- "account": "123456",
- "branch": "0001"
}
}A sub-account register was rejected by compliance.
| event required | string Value: "ACCOUNT_REGISTER_REJECTED" |
object |
{- "event": "ACCOUNT_REGISTER_REJECTED",
- "accountRegister": {
- "officialName": "Empresa Exemplo LTDA",
- "taxID": {
- "taxID": "12345678000199",
- "type": "BR:CNPJ"
}, - "status": "REJECTED",
- "rejectedReason": "Documentação não atende aos requisitos de compliance. Contrato social apresenta inconsistências com os dados cadastrais."
}
}A sub-account register is under compliance analysis.
| event required | string Value: "ACCOUNT_REGISTER_PENDING" |
object |
{- "event": "ACCOUNT_REGISTER_PENDING",
- "accountRegister": {
- "officialName": "Empresa Exemplo LTDA",
- "taxID": {
- "taxID": "12345678000199",
- "type": "BR:CNPJ"
}, - "status": "PENDING",
- "requestDocuments": [
- "SOCIAL_CONTRACT",
- "ADDRESS_PROOF"
], - "requestReason": "Faltou contrato social e comprovante de endereço",
- "requestDocumentsRepresentatives": [
- {
- "taxId": {
- "taxID": "12345678901",
- "type": "BR:CPF"
}, - "requestDocuments": [
- "RG",
- "ADDRESS_PROOF"
]
}
]
}
}The end customer completed one step of the onboarding, or the BC Protege+ gate blocked one. A single event covers all eleven steps: step, stepScope and stepStatus say which step changed and how.
| event required | string Value: "ACCOUNT_REGISTER_STEP_UPDATED" |
object The cumulative onboarding state carried by every onboarding event. A single event is enough to know where the register stands — there is no need to replay the webhook history. |
{- "event": "ACCOUNT_REGISTER_STEP_UPDATED",
- "accountRegister": {
- "accountRegisterId": "66f0c2a1d4b2f10012ab34cd",
- "correlationID": "my-unique-id",
- "officialName": "Empresa Exemplo LTDA",
- "taxID": {
- "taxID": "12345678000199",
- "type": "BR:CNPJ"
}, - "status": "PENDING",
- "completedSteps": [
- "COMPANY_DATA",
- "ADDRESS"
], - "pendingSteps": [
- "SOCIAL_CONTRACT",
- "PARTNERS",
- "TERMS",
- "REVIEW"
], - "step": "ADDRESS",
- "stepStatus": "COMPLETED",
- "stepScope": "COMPANY",
- "stepCompletedAt": "2026-09-04T14:02:11.482Z",
- "retrying": false,
- "retryCount": 0
}
}The register entered compliance analysis, either because the end customer submitted the onboarding or because an operator moved a pending register back into review. retryCount greater than zero means the register had already been sent back before.
| event required | string Value: "ACCOUNT_REGISTER_IN_REVIEW" |
object (WebhookAccountRegisterOnboarding) The cumulative onboarding state carried by every onboarding event. A single event is enough to know where the register stands — there is no need to replay the webhook history. |
{- "event": "ACCOUNT_REGISTER_IN_REVIEW",
- "accountRegister": {
- "accountRegisterId": "66f0c2a1d4b2f10012ab34cd",
- "correlationID": "my-unique-id",
- "officialName": "Empresa Exemplo LTDA",
- "taxID": {
- "taxID": "12345678000199",
- "type": "BR:CNPJ"
}, - "status": "IN_REVIEW",
- "completedSteps": [
- "COMPANY_DATA",
- "ADDRESS",
- "SOCIAL_CONTRACT",
- "PARTNERS",
- "TERMS"
], - "pendingSteps": [
- "REVIEW"
], - "retrying": true,
- "retryCount": 1
}
}Compliance asked for new documents (a request for information). Lists what was asked of the company and of each representative, and which steps went back to pending because of it. A request does not always send the register back to the customer — check status.
| event required | string Value: "ACCOUNT_REGISTER_DOCUMENTS_REQUESTED" |
object The cumulative onboarding state carried by every onboarding event. A single event is enough to know where the register stands — there is no need to replay the webhook history. |
{- "event": "ACCOUNT_REGISTER_DOCUMENTS_REQUESTED",
- "accountRegister": {
- "accountRegisterId": "66f0c2a1d4b2f10012ab34cd",
- "correlationID": "my-unique-id",
- "officialName": "Empresa Exemplo LTDA",
- "taxID": {
- "taxID": "12345678000199",
- "type": "BR:CNPJ"
}, - "status": "IN_REVIEW",
- "completedSteps": [
- "COMPANY_DATA",
- "ADDRESS",
- "PARTNERS",
- "TERMS"
], - "pendingSteps": [
- "SOCIAL_CONTRACT",
- "REVIEW"
], - "retrying": false,
- "retryCount": 1,
- "requestDocuments": [
- "SOCIAL_CONTRACT"
], - "requestDocumentsRepresentatives": [
- {
- "taxId": {
- "taxID": "12345678901",
- "type": "BR:CPF"
}, - "requestDocuments": [
- "PICTURE",
- "IDENTITY_DOCUMENT"
]
}
], - "invalidatedSteps": [
- "SOCIAL_CONTRACT",
- "REPRESENTATIVE_FACEMATCH",
- "REPRESENTATIVE_DOCUMENTS"
]
}
}The end customer sent every document compliance had asked for, and the request for information was closed. Paired with ACCOUNT_REGISTER_DOCUMENTS_REQUESTED it measures how long a customer took to answer a pending request.
| event required | string Value: "ACCOUNT_REGISTER_RFI_RESOLVED" |
object (WebhookAccountRegisterOnboarding) The cumulative onboarding state carried by every onboarding event. A single event is enough to know where the register stands — there is no need to replay the webhook history. |
{- "event": "ACCOUNT_REGISTER_RFI_RESOLVED",
- "accountRegister": {
- "accountRegisterId": "66f0c2a1d4b2f10012ab34cd",
- "correlationID": "my-unique-id",
- "officialName": "Empresa Exemplo LTDA",
- "taxID": {
- "taxID": "12345678000199",
- "type": "BR:CNPJ"
}, - "status": "IN_REVIEW",
- "completedSteps": [
- "COMPANY_DATA",
- "ADDRESS",
- "SOCIAL_CONTRACT",
- "PARTNERS",
- "TERMS"
], - "pendingSteps": [
- "REVIEW"
], - "retrying": false,
- "retryCount": 1
}
}A boleto was settled by the issuing bank. Emitted by service-boleto, and distinct from the charge being paid — settlement is when the funds clear.
| event required | string Value: "BOLETO_SETTLED" |
object | |
object |
{- "event": "BOLETO_SETTLED",
- "charge": {
- "correlationID": "3f2a2690-8224-4aae-a1ba-ed26d4d61f81",
- "value": 3000,
- "status": "COMPLETED"
}, - "boleto": {
- "boletoTransactionID": "6a84929cb1bfe8079db8105e",
- "value": 3000,
- "status": "SETTLED",
- "boletoBarcode": "34191790010104351004791020150008291070026000",
- "boletoDigitable": "34191.79001 01043.510047 91020.150008 2 91070000026000",
- "fee": 250,
- "settledAt": "2026-08-22T20:18:13.098Z",
- "finesValue": 0,
- "interestsValue": 0,
- "discountValue": 0
}
}A charge was created.
| event required | string Value: "OPENPIX:CHARGE_CREATED" |
object (WebhookCharge) The charge the event refers to. Superset of the fields observed across the charge and transaction events; a given event carries the subset that applies to it. | |
object | |
object |
{- "event": "OPENPIX:CHARGE_CREATED",
- "charge": {
- "customer": {
- "name": "customer#0",
- "phone": "119912345670",
- "taxID": {
- "taxID": "29094848074",
- "type": "BR:CPF"
}, - "correlationID": "9134e286-6f71-427a-bf00-100000000001"
}, - "value": 100,
- "identifier": "9134e2866f71427abf0010000",
- "correlationID": "9134e286-6f71-427a-bf00-100000000004",
- "paymentLinkID": "9134e286-6f71-427a-bf00-100000000005",
- "transactionID": "9134e2866f71427abf00100000000006",
- "status": "ACTIVE",
- "additionalInfo": [
- {
- "key": "amount",
- "value": "100"
}
], - "discount": 0,
- "valueWithDiscount": 100,
- "type": "DYNAMIC",
- "createdAt": "2025-09-30T15:35:13.607Z",
- "updatedAt": "2025-09-30T15:35:13.607Z",
- "ensureSameTaxID": false,
- "brCode": "00020126580014br.gov.bcb.pix0136123e4567-e12b-12d1-a456-42665544000052040000530398654041.005802BR5915Call_me_Awesome6009Sao_Paulo622905259134e2866f71427abf001000063047029",
- "expiresIn": 86400,
- "pixKey": "123e4567-e12b-12d1-a456-426655440000",
- "globalID": "Q2hhcmdlOjY4ZGJmOGIxNDc5YjhhNDYyNDAxNjIyNg=="
}, - "company": {
- "id": "68dbf8b0479b8a46240160e9",
- "name": "Awesome Company 1",
- "taxID": "00988776655"
}, - "account": {
- "environment": "PRODUCTION"
}
}A charge was paid in full.
| event required | string Value: "OPENPIX:CHARGE_COMPLETED" |
object (WebhookCharge) The charge the event refers to. Superset of the fields observed across the charge and transaction events; a given event carries the subset that applies to it. | |
object | |
object | |
object |
{- "event": "OPENPIX:CHARGE_COMPLETED",
- "charge": {
- "value": 1,
- "comment": "",
- "identifier": "d983a07836cf48ed9a65764d3c184273",
- "transactionID": "d983a07836cf48ed9a65764d3c184273",
- "status": "COMPLETED",
- "additionalInfo": [ ],
- "fee": 85,
- "discount": 0,
- "valueWithDiscount": 1,
- "expiresDate": "2025-09-25T15:08:12.278Z",
- "type": "DYNAMIC",
- "correlationID": "3f2a2690-8224-4aae-a1ba-ed26d4d61f81",
- "paymentLinkID": "788c8d0d-182b-468e-942e-546be6a621c2",
- "createdAt": "2025-09-24T15:07:47.334Z",
- "updatedAt": "2025-09-24T15:08:13.578Z",
- "customer": {
- "name": "Cliente Teste",
- "taxID": {
- "taxID": "44720743000101",
- "type": "BR:CNPJ"
}, - "correlationID": "ecd41c3b-487c-4719-b9f7-53b6dd6759cb"
}, - "paidAt": "2025-09-24T15:07:50.891Z",
- "payer": null,
- "ensureSameTaxID": false,
- "brCode": "00020101021226980014br.gov.bcb.pix2576api.woovi-sandbox.com/api/testaccount/qr/v1/d983a07836cf48ed9a65764d3c18427352040000530398654040.015802BR5921Lucas_Aprigio_Sandbox6009Sao_Paulo62290525d983a07836cf48ed9a65764d363046759",
- "expiresIn": 86424,
- "pixKey": "67856db0-ac6e-4276-8309-503a22a896dc",
- "globalID": "Q2hhcmdlOjY4ZDQwOTQzMDY5YTI4ZjgzMTEzOTVkZA=="
}, - "pix": {
- "customer": {
- "name": "Cliente Teste",
- "taxID": {
- "taxID": "44720743000101",
- "type": "BR:CNPJ"
}, - "correlationID": "ecd41c3b-487c-4719-b9f7-53b6dd6759cb"
}, - "payer": {
- "name": "Cliente Teste",
- "taxID": {
- "taxID": "44720743000101",
- "type": "BR:CNPJ"
}, - "correlationID": "ecd41c3b-487c-4719-b9f7-53b6dd6759cb"
}, - "value": 1,
- "time": "2025-09-24T15:07:50.891Z",
- "endToEndId": "Efa8df7c628cf43d2af424696ea0c6444",
- "transactionID": "d983a07836cf48ed9a65764d3c184273",
- "infoPagador": "OpenPix testing",
- "status": "CONFIRMED",
- "type": "PAYMENT",
- "createdAt": "2025-09-24T15:07:50.915Z",
- "globalID": "UGl4VHJhbnNhY3Rpb246NjhkNDA5NDYwNjlhMjhmODMxMTM5NjU4"
}, - "company": {
- "id": "6810ce3b892866f103d77ef2",
- "name": "Lucas Aprigio Sandbox",
- "taxID": "57437573000102"
}, - "account": {
- "environment": "TESTING"
}
}A charge reached its expiration without being paid in full.
| event required | string Value: "OPENPIX:CHARGE_EXPIRED" |
object (WebhookCharge) The charge the event refers to. Superset of the fields observed across the charge and transaction events; a given event carries the subset that applies to it. | |
object | |
object |
{- "event": "OPENPIX:CHARGE_EXPIRED",
- "charge": {
- "value": 1,
- "comment": "",
- "identifier": "0c0ddb5e24764191a8fa6c9afeaa26aa",
- "transactionID": "0c0ddb5e24764191a8fa6c9afeaa26aa",
- "status": "EXPIRED",
- "additionalInfo": [ ],
- "fee": 85,
- "discount": 0,
- "valueWithDiscount": 1,
- "expiresDate": "2025-09-24T15:08:00.368Z",
- "type": "DYNAMIC",
- "correlationID": "4bfa04e1-b807-4833-b714-dfa7c8877f29",
- "paymentLinkID": "4ceb0a22-d87d-46d1-b699-cf74e171386d",
- "createdAt": "2025-09-24T15:03:38.922Z",
- "updatedAt": "2025-09-24T15:09:00.042Z",
- "ensureSameTaxID": false,
- "brCode": "00020101021226870014br.gov.bcb.pix2565qr-h.woovi.digital/qr/v2/cob/92b4992a-92de-423b-938e-0b0b6e534a0052040000530398654040.015802BR592357419727_WOOVI_IP_6009Sao_Paulo622905250c0ddb5e24764191a8fa6c9af6304C6D5",
- "expiresIn": 300,
- "paymentLinkUrl": "undefined/4ceb0a22-d87d-46d1-b699-cf74e171386d",
- "globalID": "Q2hhcmdlOjY4ZDQwODRhZjNmMjk2YTY1MGM5OWNjMg=="
}, - "company": {
- "id": "67b87652d865a18620c53604",
- "name": "WOOVI-IP",
- "taxID": "44720743000101"
}, - "account": {
- "environment": "PRODUCTION"
}
}A charge was paid by a payer whose taxID differs from the charge customer. Only sent when the charge does not enforce the same taxID.
| event required | string Value: "OPENPIX:CHARGE_COMPLETED_NOT_SAME_CUSTOMER_PAYER" |
object (WebhookCharge) The charge the event refers to. Superset of the fields observed across the charge and transaction events; a given event carries the subset that applies to it. | |
object | |
object | |
object | |
object |
{- "event": "OPENPIX:CHARGE_COMPLETED_NOT_SAME_CUSTOMER_PAYER",
- "charge": {
- "customer": {
- "name": "Jão",
- "phone": "119912345670",
- "taxID": {
- "taxID": "29094848074",
- "type": "BR:CPF"
}, - "correlationID": "9134e286-6f71-427a-bf00-100000000001"
}, - "value": 100,
- "status": "COMPLETED",
- "payer": {
- "name": "Ana",
- "phone": "119912345671",
- "taxID": {
- "taxID": "29094848074",
- "type": "BR:CPF"
}, - "correlationID": "9134e286-6f71-427a-bf00-100000000002"
}, - "discount": 0,
- "valueWithDiscount": 100,
- "type": "DYNAMIC",
- "identifier": "9134e2866f71427abf0010000",
- "correlationID": "9134e286-6f71-427a-bf00-100000000005",
- "paymentLinkID": "9134e286-6f71-427a-bf00-100000000006",
- "transactionID": "9134e2866f71427abf00100000000007",
- "additionalInfo": [ ],
- "createdAt": "2025-09-30T13:50:56.065Z",
- "updatedAt": "2025-09-30T13:50:56.065Z",
- "ensureSameTaxID": false,
- "brCode": "00020126580014br.gov.bcb.pix0136123e4567-e12b-12d1-a456-42665544000052040000530398654041.005802BR5915Call_me_Awesome6009Sao_Paulo622905259134e2866f71427abf001000063047029",
- "expiresIn": 86400,
- "pixKey": "123e4567-e12b-12d1-a456-426655440000",
- "globalID": "Q2hhcmdlOjY4ZGJlMDQwZGNkOTlmNzM1NDhmYjllOQ=="
}, - "pix": {
- "customer": {
- "name": "Jão",
- "phone": "119912345670",
- "taxID": {
- "taxID": "29094848074",
- "type": "BR:CPF"
}, - "correlationID": "9134e286-6f71-427a-bf00-100000000001"
}, - "payer": {
- "name": "Jão",
- "phone": "119912345670",
- "taxID": {
- "taxID": "29094848074",
- "type": "BR:CPF"
}, - "correlationID": "9134e286-6f71-427a-bf00-100000000001"
}, - "value": 100,
- "time": "2022-09-05T11:05:11.000Z",
- "endToEndId": "endToEndId#0",
- "infoPagador": "payer info 0",
- "status": "CONFIRMED",
- "type": "PAYMENT",
- "createdAt": "2025-09-30T13:50:56.075Z",
- "globalID": "UGl4VHJhbnNhY3Rpb246NjhkYmUwNDBkY2Q5OWY3MzU0OGZiOWVl"
}, - "company": {
- "id": "68dbe03fdcd99f73548fb8f3",
- "name": "Awesome Company 1"
}, - "account": {
- "clientId": "clientId",
- "environment": "TESTING"
}, - "payer": {
- "name": "Ana",
- "phone": "119912345671",
- "taxID": {
- "taxID": "29094848074",
- "type": "BR:CPF"
}
}
}A MED dispute was opened against a transaction of this account.
| event required | string Value: "OPENPIX:DISPUTE_CREATED" |
object |
{- "event": "OPENPIX:DISPUTE_CREATED",
- "dispute": {
- "status": "OPENED",
- "endToEndId": "E3524a995bbd54034b6d07c1c36014557",
- "name": "Seu jorge",
- "phoneNumber": "+5519989673846",
- "value": 1000,
- "disputeReason": "Golpe"
}
}A MED dispute was accepted and the amount is returned to the payer.
| event required | string Value: "OPENPIX:DISPUTE_ACCEPTED" |
object |
{- "event": "OPENPIX:DISPUTE_ACCEPTED",
- "dispute": {
- "status": "ACCEPTED",
- "endToEndId": "E3524a995bbd54034b6d07c1c36014557",
- "name": "Seu jorge",
- "phoneNumber": "+5519989673846",
- "value": 1000,
- "disputeReason": "Golpe"
}
}A MED dispute was rejected and the amount stays with this account.
| event required | string Value: "OPENPIX:DISPUTE_REJECTED" |
object |
{- "event": "OPENPIX:DISPUTE_REJECTED",
- "dispute": {
- "status": "REJECTED",
- "endToEndId": "E3524a995bbd54034b6d07c1c36014557",
- "name": "Seu jorge",
- "phoneNumber": "+5519989673846",
- "value": 1000,
- "disputeReason": "Golpe"
}
}A MED dispute was canceled by the reporting institution.
| event required | string Value: "OPENPIX:DISPUTE_CANCELED" |
object |
{- "event": "OPENPIX:DISPUTE_CANCELED",
- "dispute": {
- "status": "CANCELED",
- "endToEndId": "E3524a995bbd54034b6d07c1c36014557",
- "name": "Seu jorge",
- "phoneNumber": "+5519989673846",
- "value": 1000,
- "disputeReason": "Golpe"
}
}An outbound payment was confirmed and the Pix left the account.
| event required | string Value: "OPENPIX:MOVEMENT_CONFIRMED" |
object | |
object |
{- "event": "OPENPIX:MOVEMENT_CONFIRMED",
- "payment": {
- "value": 30,
- "status": "CONFIRMED",
- "destinationAlias": "06882328684",
- "comment": "",
- "correlationID": "222a1750-de17-406c-bd0c-25af9a5a5d08"
}, - "transaction": {
- "value": 30,
- "endToEndId": "E23114447202303161242u80lZNR7nQZ",
- "time": "2023-03-16T12:42:47.526Z"
}
}An outbound payment was approved but failed on the way out. error carries the reason.
| event required | string Value: "OPENPIX:MOVEMENT_FAILED" |
object | |
object | |
object |
{- "event": "OPENPIX:MOVEMENT_FAILED",
- "payment": {
- "value": 30,
- "status": "FAILED",
- "destinationAlias": "06882328684",
- "comment": "",
- "correlationID": "222a1750-de17-406c-bd0c-25af9a5a5d08"
}, - "transaction": {
- "value": 30,
- "endToEndId": "E23114447202303161242u80lZNR7nQZ",
- "time": "2023-03-16T12:42:47.526Z"
}, - "error": {
- "code": "PAY_PIX_KEY_ERROR",
- "description": "Falha ao Pagar Chave Pix"
}
}An outbound payment was removed before being approved.
| event required | string Value: "OPENPIX:MOVEMENT_REMOVED" |
object |
{- "event": "OPENPIX:MOVEMENT_REMOVED",
- "payment": {
- "correlationID": "222a1750-de17-406c-bd0c-25af9a5a5d08"
}
}The payer's bank approved the recurring mandate.
| event required | string Value: "PIX_AUTOMATIC_APPROVED" |
object | |
| dayGenerateCharge | integer |
| value | integer |
| status | string |
| correlationID | string |
object | |
| globalID | string |
{- "event": "PIX_AUTOMATIC_APPROVED",
- "customer": {
- "name": "Dan",
- "phone": "+5511999999999",
- "address": {
- "zipcode": "04556300",
- "street": "rua de são paulo",
- "number": "3432",
- "neighborhood": "BROOKLIN PAULISTA",
- "city": "VITORIA",
- "state": "SP",
- "complement": "CONJ 26",
- "country": "BR",
- "location": {
- "coordinates": [ ]
}, - "_id": "68a88321d65cb2d507a2ee1d"
}, - "taxID": {
- "taxID": "111111111",
- "type": "BR:CPF"
}, - "correlationID": "6f4131ea-b816-4b08-8ba6-11cf6b622a6e"
}, - "dayGenerateCharge": 24,
- "value": 100,
- "status": "ACTIVE",
- "correlationID": "UniqueID1344445457t11653453223241",
- "pixRecurring": {
- "recurrencyId": "RN5481141720250822YHKirVyWBjF",
- "emv": "qrcode",
- "journey": "ONLY_RECURRENCY",
- "status": "APPROVED"
}, - "globalID": "UGF5bWVudFN1YnNjcmlwdGlvbjo2OGE4ODMyMWQ2NWNiMmQ1MDdhMmVlMjk="
}The payer rejected the recurring mandate.
| event required | string Value: "PIX_AUTOMATIC_REJECTED" |
object | |
| dayGenerateCharge | integer |
| value | integer |
| status | string |
| correlationID | string |
object | |
| globalID | string |
{- "event": "PIX_AUTOMATIC_REJECTED",
- "customer": {
- "name": "Dan",
- "phone": "+5511999999999",
- "address": {
- "zipcode": "04556300",
- "street": "rua de são paulo",
- "number": "3432",
- "neighborhood": "BROOKLIN PAULISTA",
- "city": "VITORIA",
- "state": "SP",
- "complement": "CONJ 26",
- "country": "BR",
- "location": {
- "coordinates": [ ]
}, - "_id": "68a88321d65cb2d507a2ee1d"
}, - "taxID": {
- "taxID": "111111111",
- "type": "BR:CPF"
}, - "correlationID": "6f4131ea-b816-4b08-8ba6-11cf6b622a6e"
}, - "dayGenerateCharge": 24,
- "value": 100,
- "status": "INACTIVE",
- "correlationID": "UniqueID1344445457t11653453223241",
- "pixRecurring": {
- "recurrencyId": "RN5481141720250822YHKirVyWBjF",
- "emv": "qrcode",
- "journey": "ONLY_RECURRENCY",
- "status": "REJECTED"
}, - "globalID": "UGF5bWVudFN1YnNjcmlwdGlvbjo2OGE4ODMyMWQ2NWNiMmQ1MDdhMmVlMjk="
}A recurring charge was created for an installment of the mandate.
| event required | string Value: "PIX_AUTOMATIC_COBR_CREATED" |
| dateGenerateCharge | string |
| expiration | integer |
| installmentNumber | integer |
| value | integer |
| status | string |
| createdAt | string |
object | |
| correlationID | string |
| paymentSubscriptionGlobalID | string |
| globalID | string |
{- "event": "PIX_AUTOMATIC_COBR_CREATED",
- "dateGenerateCharge": "2025-08-24T12:00:00.000Z",
- "expiration": 259200,
- "installmentNumber": 1,
- "value": 100,
- "status": "SCHEDULED",
- "createdAt": "2025-08-22T14:48:02.697Z",
- "cobr": {
- "identifierId": "01K3942Y0DFEK73H541ZADVK0P",
- "recurrencyId": "RN5481141720250822YHKirVyWBjF",
- "status": "CREATED",
- "tries": [
- {
- "tryStatus": "REQUESTED",
- "value": 1,
- "finalityPurpose": "AGND",
- "requestedExecutionDate": "2025-09-05T12:00:00.000Z",
- "createdAt": "2025-09-04T03:01:58.543Z",
- "updatedAt": "2025-09-04T03:04:03.921Z"
}
], - "value": 100,
- "createdAt": "2025-08-22T14:49:22.702Z"
}, - "correlationID": "9134e286-6f71-427a-bf00-100000000005",
- "paymentSubscriptionGlobalID": "UGF5bWVudFN1YnNjcmlwdGlvbjo2OGFjYmNkNGE5NTY1M2VmMjQzYjY2Zjc=",
- "globalID": "UGF5bWVudFN1YnNjcmlwdGlvbkluc3RhbGxtZW50OjY4YTg4MzIyZDY1Y2IyZDUwN2EyZWUzYg=="
}The payer's bank approved the recurring charge.
| event required | string Value: "PIX_AUTOMATIC_COBR_APPROVED" |
| dateGenerateCharge | string |
| expiration | integer |
| installmentNumber | integer |
| value | integer |
| status | string |
| createdAt | string |
object | |
| correlationID | string |
| paymentSubscriptionGlobalID | string |
| globalID | string |
{- "event": "PIX_AUTOMATIC_COBR_APPROVED",
- "dateGenerateCharge": "2025-08-24T12:00:00.000Z",
- "expiration": 259200,
- "installmentNumber": 1,
- "value": 100,
- "status": "ACTIVE",
- "createdAt": "2025-08-22T14:48:02.697Z",
- "cobr": {
- "identifierId": "01K3942Y0DFEK73H541ZADVK0P",
- "recurrencyId": "RN5481141720250822YHKirVyWBjF",
- "status": "ACTIVE",
- "tries": [
- {
- "tryStatus": "SCHEDULED",
- "value": 1,
- "finalityPurpose": "AGND",
- "requestedExecutionDate": "2025-09-05T12:00:00.000Z",
- "createdAt": "2025-09-04T03:01:58.543Z",
- "updatedAt": "2025-09-04T03:04:03.921Z"
}
], - "value": 100,
- "createdAt": "2025-08-22T14:49:22.702Z"
}, - "correlationID": "9134e286-6f71-427a-bf00-100000000005",
- "paymentSubscriptionGlobalID": "UGF5bWVudFN1YnNjcmlwdGlvbjo2OGFjYmNkNGE5NTY1M2VmMjQzYjY2Zjc=",
- "globalID": "UGF5bWVudFN1YnNjcmlwdGlvbkluc3RhbGxtZW50OjY4YTg4MzIyZDY1Y2IyZDUwN2EyZWUzYg=="
}The payer's bank rejected the recurring charge.
| event required | string Value: "PIX_AUTOMATIC_COBR_REJECTED" |
| dateGenerateCharge | string |
| expiration | integer |
| installmentNumber | integer |
| value | integer |
| status | string |
| createdAt | string |
object | |
| correlationID | string |
| paymentSubscriptionGlobalID | string |
| globalID | string |
{- "event": "PIX_AUTOMATIC_COBR_REJECTED",
- "dateGenerateCharge": "2025-08-24T12:00:00.000Z",
- "expiration": 259200,
- "installmentNumber": 1,
- "value": 100,
- "status": "CANCEL",
- "createdAt": "2025-08-22T14:48:02.697Z",
- "cobr": {
- "identifierId": "01K3942Y0DFEK73H541ZADVK0P",
- "recurrencyId": "RN5481141720250822YHKirVyWBjF",
- "status": "REJECTED",
- "tries": [
- {
- "tryStatus": "REJECTED",
- "value": 1,
- "finalityPurpose": "AGND",
- "requestedExecutionDate": "2025-09-05T12:00:00.000Z",
- "createdAt": "2025-09-04T03:01:58.543Z",
- "updatedAt": "2025-09-04T03:04:03.921Z",
- "rejectCode": "DTED"
}
], - "rejectCode": "DTED",
- "value": 100,
- "createdAt": "2025-08-22T14:49:22.702Z"
}, - "correlationID": "9134e286-6f71-427a-bf00-100000000005",
- "paymentSubscriptionGlobalID": "UGF5bWVudFN1YnNjcmlwdGlvbjo2OGFjYmNkNGE5NTY1M2VmMjQzYjY2Zjc=",
- "globalID": "UGF5bWVudFN1YnNjcmlwdGlvbkluc3RhbGxtZW50OjY4YTg4MzIyZDY1Y2IyZDUwN2EyZWUzYg=="
}A recurring charge was paid.
| event required | string Value: "PIX_AUTOMATIC_COBR_COMPLETED" |
| dateGenerateCharge | string |
| expiration | integer |
| installmentNumber | integer |
| value | integer |
| status | string |
| createdAt | string |
object | |
| correlationID | string |
| paymentSubscriptionGlobalID | string |
| globalID | string |
{- "event": "PIX_AUTOMATIC_COBR_COMPLETED",
- "dateGenerateCharge": "2025-08-24T12:00:00.000Z",
- "expiration": 259200,
- "installmentNumber": 1,
- "value": 100,
- "status": "COMPLETED",
- "createdAt": "2025-08-22T14:48:02.697Z",
- "cobr": {
- "identifierId": "01K3942Y0DFEK73H541ZADVK0P",
- "recurrencyId": "RN5481141720250822YHKirVyWBjF",
- "status": "COMPLETED",
- "endToEndId": "my-end-to-end-id",
- "tries": [
- {
- "tryStatus": "PAID",
- "value": 1,
- "finalityPurpose": "AGND",
- "requestedExecutionDate": "2025-09-05T12:00:00.000Z",
- "createdAt": "2025-09-04T03:01:58.543Z",
- "updatedAt": "2025-09-04T03:04:03.921Z"
}
], - "value": 100,
- "createdAt": "2025-08-22T14:49:22.702Z"
}, - "correlationID": "9134e286-6f71-427a-bf00-100000000005",
- "paymentSubscriptionGlobalID": "UGF5bWVudFN1YnNjcmlwdGlvbjo2OGFjYmNkNGE5NTY1M2VmMjQzYjY2Zjc=",
- "globalID": "UGF5bWVudFN1YnNjcmlwdGlvbkluc3RhbGxtZW50OjY4YTg4MzIyZDY1Y2IyZDUwN2EyZWUzYg=="
}A new attempt was requested for a recurring charge.
| event required | string Value: "PIX_AUTOMATIC_COBR_TRY_REQUESTED" |
| dateGenerateCharge | string |
| expiration | integer |
| installmentNumber | integer |
| value | integer |
| status | string |
| createdAt | string |
object | |
| correlationID | string |
| paymentSubscriptionGlobalID | string |
| globalID | string |
{- "event": "PIX_AUTOMATIC_COBR_TRY_REQUESTED",
- "dateGenerateCharge": "2025-09-05T12:00:00.000Z",
- "expiration": 1209600,
- "installmentNumber": 2,
- "value": 1,
- "status": "SCHEDULED",
- "createdAt": "2025-09-04T03:00:20.372Z",
- "cobr": {
- "identifierId": "01K49ARZMETSD7XJ2H86HV188H",
- "recurrencyId": "RN5481141720250811Vs0a16RIRVm",
- "status": "CREATED",
- "tries": [
- {
- "tryStatus": "REQUESTED",
- "value": 1,
- "finalityPurpose": "AGND",
- "requestedExecutionDate": "2025-09-05T12:00:00.000Z",
- "createdAt": "2025-09-04T03:01:58.543Z",
- "updatedAt": "2025-09-04T03:04:03.921Z",
- "rejectCode": "FBRD"
}
], - "value": 1,
- "description": "comment",
- "createdAt": "2025-09-04T03:01:58.543Z"
}, - "correlationID": "9134e286-6f71-427a-bf00-100000000005",
- "paymentSubscriptionGlobalID": "UGF5bWVudFN1YnNjcmlwdGlvbjo2ODlhNTA1NmVjY2NkZTViMzdmYzE0MDE=",
- "globalID": "UGF5bWVudFN1YnNjcmlwdGlvbkluc3RhbGxtZW50OjY4YjkwMGM0ZDE5ZTBlY2QwMmQ2NzViMg=="
}The payer's bank rejected the retry.
| event required | string Value: "PIX_AUTOMATIC_COBR_TRY_REJECTED" |
| dateGenerateCharge | string |
| expiration | integer |
| installmentNumber | integer |
| value | integer |
| status | string |
| createdAt | string |
object | |
| correlationID | string |
| paymentSubscriptionGlobalID | string |
| globalID | string |
{- "event": "PIX_AUTOMATIC_COBR_TRY_REJECTED",
- "dateGenerateCharge": "2025-09-05T12:00:00.000Z",
- "expiration": 1209600,
- "installmentNumber": 2,
- "value": 1,
- "status": "CANCELED",
- "createdAt": "2025-09-04T03:00:20.372Z",
- "cobr": {
- "identifierId": "01K49ARZMETSD7XJ2H86HV188H",
- "recurrencyId": "RN5481141720250811Vs0a16RIRVm",
- "status": "FAILED_TRY",
- "tries": [
- {
- "tryStatus": "REJECTED",
- "value": 1,
- "finalityPurpose": "AGND",
- "requestedExecutionDate": "2025-09-05T12:00:00.000Z",
- "createdAt": "2025-09-04T03:01:58.543Z",
- "updatedAt": "2025-09-04T03:04:03.921Z",
- "rejectCode": "FBRD"
}
], - "value": 1,
- "description": "comment",
- "createdAt": "2025-09-04T03:01:58.543Z"
}, - "correlationID": "9134e286-6f71-427a-bf00-100000000005",
- "paymentSubscriptionGlobalID": "UGF5bWVudFN1YnNjcmlwdGlvbjo2ODlhNTA1NmVjY2NkZTViMzdmYzE0MDE=",
- "globalID": "UGF5bWVudFN1YnNjcmlwdGlvbkluc3RhbGxtZW50OjY4YjkwMGM0ZDE5ZTBlY2QwMmQ2NzViMg=="
}A refund credited to this account was confirmed.
| event required | string Value: "PIX_TRANSACTION_REFUND_RECEIVED_CONFIRMED" |
object | |
object | |
object | |
object |
{- "event": "PIX_TRANSACTION_REFUND_RECEIVED_CONFIRMED",
- "refundTransaction": {
- "value": 10001,
- "time": "2025-08-14T21:31:49.755Z",
- "endToEndId": "D548114172025081421318FbVaF2LTWr",
- "status": "CONFIRMED",
- "type": "REFUND",
- "debitParty": {
- "account": {
- "branch": "0001",
- "account": "00000000000000000221",
- "accountType": "TRAN"
}, - "psp": {
- "id": "54811417",
- "name": "WOOVI IP LTDA."
}, - "holder": {
- "taxID": {
- "taxID": "47960950000121",
- "type": "BR:CNPJ"
}
}
}, - "creditParty": {
- "account": {
- "branch": "001",
- "account": "73519",
- "accountType": "TRAN"
}, - "psp": {
- "id": "31680151",
- "name": "SWAP IP S.A."
}, - "holder": {
- "name": "Sapataria Xiq Bom",
- "taxID": {
- "taxID": "06888687000120",
- "type": "BR:CNPJ"
}
}
}, - "createdAt": "2025-08-14T21:31:49.821Z",
- "partial": false,
- "globalID": "UGl4VHJhbnNhY3Rpb246Njg5ZTU1YzVkNDEzYTJhYzZmMWRlMDcz"
}, - "originalTransaction": {
- "payer": {
- "name": "Sapataria Xiq Bom",
- "taxID": {
- "taxID": "06888687000120",
- "type": "BR:CNPJ"
}, - "correlationID": "862adf9d-aae6-407e-86ba-5948d87ed591"
}, - "value": 10001,
- "time": "2025-08-14T15:43:33.000Z",
- "endToEndId": "E31680151202508141543GVL7OCT44VU",
- "status": "CONFIRMED",
- "type": "PAYMENT",
- "debitParty": {
- "account": {
- "branch": "001",
- "account": "73519",
- "accountType": "TRAN"
}, - "psp": {
- "id": "31680151",
- "name": "SWAP IP S.A."
}, - "holder": {
- "name": "Sapataria Xiq Bom",
- "taxID": {
- "taxID": "06888687000120",
- "type": "BR:CNPJ"
}
}
}, - "creditParty": {
- "account": {
- "branch": "0001",
- "account": "00000000000000000221",
- "accountType": "TRAN"
}, - "psp": {
- "id": "54811417",
- "name": "WOOVI IP LTDA."
}, - "holder": {
- "taxID": {
- "taxID": "47960950000121",
- "type": "BR:CNPJ"
}
}
}, - "createdAt": "2025-08-14T15:43:33.396Z",
- "globalID": "UGl4VHJhbnNhY3Rpb246Njg5ZTA0MjVmMzE2MmMzZjE4MzVmMmM5"
}, - "company": {
- "id": "6762e45c55eb2e0a3b3cbc44",
- "name": "MAGAZINE LUIZA S/A",
- "nameFriendly": "MAGAZINE LUIZA",
- "correlationID": "f7b21ff8-a0b0-4e6a-929c-c5c483174578"
}, - "account": {
- "id": "67a4bb7a7c9720a18b10648a",
- "name": "Conta 8084",
- "status": "OPEN",
- "code": "54811417",
- "branch": "0001",
- "account": "00000000000000000221"
}
}A refund credited to this account was rejected. error carries the reason.
| event required | string Value: "PIX_TRANSACTION_REFUND_RECEIVED_REJECTED" |
object | |
object | |
object | |
object | |
| error | string |
{- "event": "PIX_TRANSACTION_REFUND_RECEIVED_REJECTED",
- "refundTransaction": {
- "value": 11111,
- "time": "2025-09-02T19:26:14.000Z",
- "endToEndId": "D316801512025090219260S5HQTVTM3L",
- "status": "REJECTED",
- "type": "REFUND",
- "debitParty": {
- "pixKey": {
- "pixKey": "+5518996879998",
- "type": "PHONE"
}, - "account": {
- "branch": "001",
- "account": "73519",
- "accountType": "TRAN"
}, - "psp": {
- "id": "31680151",
- "name": "SWAP IP S.A."
}, - "holder": {
- "taxID": {
- "taxID": "06888687000120",
- "type": "BR:CNPJ"
}
}
}, - "creditParty": {
- "account": {
- "branch": "001",
- "account": "00000000000000000221",
- "accountType": "TRAN"
}, - "psp": {
- "id": "54811417",
- "name": "WOOVI IP LTDA."
}, - "holder": {
- "name": "MAGAZINE LUIZA SA",
- "taxID": {
- "taxID": "47960950000121",
- "type": "BR:CNPJ"
}
}
}, - "createdAt": "2025-09-02T19:26:14.754Z",
- "partial": false,
- "globalID": "UGl4VHJhbnNhY3Rpb246NjhiNzQ0ZDZlNjRhMmIwYzQzNTUyNTlj"
}, - "originalTransaction": {
- "value": 11111,
- "time": "2025-09-01T22:02:51.018Z",
- "endToEndId": "E54811417202509012202ylo4UjIp2hq",
- "status": "CONFIRMED",
- "type": "WITHDRAW",
- "debitParty": {
- "account": {
- "branch": "0001",
- "account": "00000000000000000221",
- "accountType": "TRAN"
}, - "psp": {
- "id": "54811417",
- "name": "WOOVI IP LTDA",
- "code": "54811417"
}, - "holder": {
- "name": "MAGAZINE LUIZA S/A",
- "nameFriendly": "MAGAZINE LUIZA",
- "taxID": {
- "taxID": "47960950000121",
- "type": "BR:CNPJ"
}
}
}, - "creditParty": {
- "pixKey": {
- "pixKey": "+5518996879998",
- "type": "PHONE"
}, - "account": {
- "branch": "001",
- "account": "73519",
- "accountType": "TRAN"
}, - "psp": {
- "id": "31680151",
- "name": "SWAP IP S.A."
}, - "holder": {
- "name": "Sapataria Xiq Bom LTDA",
- "nameFriendly": "Sapataria Xiq Bom LTDA",
- "taxID": {
- "taxID": "06888687000120",
- "type": "BR:CNPJ"
}
}
}, - "createdAt": "2025-09-01T22:02:51.087Z",
- "globalID": "UGl4VHJhbnNhY3Rpb246NjhiNjE4MGIyNDk4YjdkM2MyMDA0MDVl"
}, - "company": {
- "id": "6762e45c55eb2e0a3b3cbc44",
- "name": "MAGAZINE LUIZA S/A",
- "nameFriendly": "MAGAZINE LUIZA",
- "correlationID": "f7b21ff8-a0b0-4e6a-929c-c5c483174578"
}, - "account": {
- "id": "67a4bb7a7c9720a18b10648a",
- "name": "Conta 8084",
- "status": "OPEN",
- "code": "54811417",
- "branch": "0001",
- "account": "00000000000000000221"
}, - "error": "AC06 - Conta bloqueada do Pix"
}A refund this account sent was confirmed.
| event required | string Value: "PIX_TRANSACTION_REFUND_SENT_CONFIRMED" |
object | |
object | |
object | |
object |
{- "event": "PIX_TRANSACTION_REFUND_SENT_CONFIRMED",
- "refundTransaction": {
- "value": 10001,
- "time": "2025-08-14T21:31:49.755Z",
- "endToEndId": "D548114172025081421318FbVaF2LTWr",
- "status": "CONFIRMED",
- "type": "REFUND",
- "debitParty": {
- "account": {
- "branch": "0001",
- "account": "00000000000000000221",
- "accountType": "TRAN"
}, - "psp": {
- "id": "54811417",
- "name": "WOOVI IP LTDA."
}, - "holder": {
- "taxID": {
- "taxID": "47960950000121",
- "type": "BR:CNPJ"
}
}
}, - "creditParty": {
- "account": {
- "branch": "001",
- "account": "73519",
- "accountType": "TRAN"
}, - "psp": {
- "id": "31680151",
- "name": "SWAP IP S.A."
}, - "holder": {
- "name": "Sapataria Xiq Bom",
- "taxID": {
- "taxID": "06888687000120",
- "type": "BR:CNPJ"
}
}
}, - "createdAt": "2025-08-14T21:31:49.821Z",
- "partial": false,
- "globalID": "UGl4VHJhbnNhY3Rpb246Njg5ZTU1YzVkNDEzYTJhYzZmMWRlMDcz"
}, - "originalTransaction": {
- "payer": {
- "name": "Sapataria Xiq Bom",
- "taxID": {
- "taxID": "06888687000120",
- "type": "BR:CNPJ"
}, - "correlationID": "862adf9d-aae6-407e-86ba-5948d87ed591"
}, - "value": 10001,
- "time": "2025-08-14T15:43:33.000Z",
- "endToEndId": "E31680151202508141543GVL7OCT44VU",
- "status": "CONFIRMED",
- "type": "PAYMENT",
- "debitParty": {
- "account": {
- "branch": "001",
- "account": "73519",
- "accountType": "TRAN"
}, - "psp": {
- "id": "31680151",
- "name": "SWAP IP S.A."
}, - "holder": {
- "name": "Sapataria Xiq Bom",
- "taxID": {
- "taxID": "06888687000120",
- "type": "BR:CNPJ"
}
}
}, - "creditParty": {
- "account": {
- "branch": "0001",
- "account": "00000000000000000221",
- "accountType": "TRAN"
}, - "psp": {
- "id": "54811417",
- "name": "WOOVI IP LTDA."
}, - "holder": {
- "taxID": {
- "taxID": "47960950000121",
- "type": "BR:CNPJ"
}
}
}, - "createdAt": "2025-08-14T15:43:33.396Z",
- "globalID": "UGl4VHJhbnNhY3Rpb246Njg5ZTA0MjVmMzE2MmMzZjE4MzVmMmM5"
}, - "company": {
- "id": "6762e45c55eb2e0a3b3cbc44",
- "name": "MAGAZINE LUIZA S/A",
- "nameFriendly": "MAGAZINE LUIZA",
- "correlationID": "f7b21ff8-a0b0-4e6a-929c-c5c483174578"
}, - "account": {
- "id": "67a4bb7a7c9720a18b10648a",
- "name": "Conta 8084",
- "status": "OPEN",
- "code": "54811417",
- "branch": "0001",
- "account": "00000000000000000221"
}
}A refund this account sent was rejected. error carries the reason.
| event required | string Value: "PIX_TRANSACTION_REFUND_SENT_REJECTED" |
object | |
object | |
object | |
object | |
| error | string |
{- "event": "PIX_TRANSACTION_REFUND_SENT_REJECTED",
- "refundTransaction": {
- "value": 10001,
- "time": "2025-08-22T16:47:46.719Z",
- "endToEndId": "D54811417202508221647qjsBFT3ArbQ",
- "infoPagador": "test",
- "status": "REJECTED",
- "type": "REFUND",
- "debitParty": {
- "pixKey": {
- "pixKey": "fd569fbc-a0cb-410a-9ec1-45bf3c869407",
- "type": "RANDOM"
}, - "account": {
- "branch": "0001",
- "account": "00000000000000000221",
- "accountType": "TRAN"
}, - "psp": {
- "id": "54811417",
- "name": "WOOVI IP LTDA."
}, - "holder": {
- "taxID": {
- "taxID": "47960950000121",
- "type": "BR:CNPJ"
}
}
}, - "creditParty": {
- "account": {
- "branch": "001",
- "account": "73519",
- "accountType": "TRAN"
}, - "psp": {
- "id": "31680151",
- "name": "SWAP IP S.A."
}, - "holder": {
- "name": "Sapataria Xiq Bom",
- "taxID": {
- "taxID": "06888687000120",
- "type": "BR:CNPJ"
}
}
}, - "createdAt": "2025-08-22T16:47:46.846Z",
- "partial": false,
- "globalID": "UGl4VHJhbnNhY3Rpb246NjhhODlmMzI4Mjc1MzViODY1ODUyMTlm"
}, - "originalTransaction": {
- "payer": {
- "name": "Sapataria Xiq Bom",
- "taxID": {
- "taxID": "06888687000120",
- "type": "BR:CNPJ"
}, - "correlationID": "862adf9d-aae6-407e-86ba-5948d87ed591"
}, - "value": 10001,
- "time": "2025-08-22T16:30:42.000Z",
- "endToEndId": "E31680151202508221630EG1PB3VBC54",
- "status": "CONFIRMED",
- "type": "PAYMENT",
- "debitParty": {
- "account": {
- "branch": "001",
- "account": "73519",
- "accountType": "TRAN"
}, - "psp": {
- "id": "31680151",
- "name": "SWAP IP S.A."
}, - "holder": {
- "name": "Sapataria Xiq Bom",
- "taxID": {
- "taxID": "06888687000120",
- "type": "BR:CNPJ"
}
}
}, - "creditParty": {
- "pixKey": {
- "pixKey": "fd569fbc-a0cb-410a-9ec1-45bf3c869407",
- "type": "RANDOM"
}, - "account": {
- "branch": "0001",
- "account": "00000000000000000221",
- "accountType": "TRAN"
}, - "psp": {
- "id": "54811417",
- "name": "WOOVI IP LTDA."
}, - "holder": {
- "taxID": {
- "taxID": "47960950000121",
- "type": "BR:CNPJ"
}
}
}, - "createdAt": "2025-08-22T16:30:42.970Z",
- "globalID": "UGl4VHJhbnNhY3Rpb246NjhhODliMzJlNzY0NDc3YTE1MGNkMzI1"
}, - "company": {
- "id": "6762e45c55eb2e0a3b3cbc44",
- "name": "MAGAZINE LUIZA S/A",
- "nameFriendly": "MAGAZINE LUIZA",
- "correlationID": "f7b21ff8-a0b0-4e6a-929c-c5c483174578"
}, - "account": {
- "id": "67a4bb7a7c9720a18b10648a",
- "name": "Conta 8084",
- "status": "OPEN",
- "code": "54811417",
- "branch": "0001",
- "account": "00000000000000000221"
}, - "error": "ED05 - Pagamento rejeitado pelo PSP do recebedor"
}A stablecoin deposit settled. Emitted by woovi-stablecoin.
| event required | string Value: "STABLECOIN_DEPOSIT_COMPLETED" |
object | |
object Public company info. |
{- "event": "STABLECOIN_DEPOSIT_COMPLETED",
- "stableDeposit": {
- "id": "68d40943069a28f8311395dd",
- "status": "COMPLETED",
- "inputAmount": 10000,
- "inputCurrency": "BRL",
- "outputAmount": 1780,
- "outputCurrency": "USDC",
- "txHash": "0x9f2c1d5a7b3e4f6081c2d3e4f50617283940a1b2",
- "correlationID": "3f2a2690-8224-4aae-a1ba-ed26d4d61f81",
- "completedAt": "2026-08-19T20:42:19.654Z"
}, - "company": {
- "id": "6736a844b2554cc88e9d5124",
- "name": "ACME",
- "taxID": "44720743000101"
}
}A stablecoin deposit did not settle. reason always comes; errorCode only when the provider gave one.
| event required | string Value: "STABLECOIN_DEPOSIT_FAILED" |
object | |
object Public company info. | |
| reason | string |
| errorCode | string |
{- "event": "STABLECOIN_DEPOSIT_FAILED",
- "stableDeposit": {
- "id": "68d40943069a28f8311395dd",
- "status": "FAILED",
- "inputAmount": 10000,
- "inputCurrency": "BRL",
- "outputCurrency": "USDC",
- "correlationID": "3f2a2690-8224-4aae-a1ba-ed26d4d61f81",
- "failedAt": "2026-08-19T20:44:02.118Z"
}, - "company": {
- "id": "6736a844b2554cc88e9d5124",
- "name": "ACME",
- "taxID": "44720743000101"
}, - "reason": "quote expired before settlement",
- "errorCode": "QUOTE_EXPIRED"
}A stablecoin payout was paid out over Pix. Emitted by woovi-stablecoin.
| event required | string Value: "STABLECOIN_PAYOUT_COMPLETED" |
object | |
object Public company info. |
{- "event": "STABLECOIN_PAYOUT_COMPLETED",
- "stablePayout": {
- "id": "68d40943069a28f8311395de",
- "status": "COMPLETED",
- "inputAmount": 1780,
- "inputCurrency": "USDC",
- "outputAmount": 10000,
- "outputCurrency": "BRL",
- "pixKey": "67856db0-ac6e-4276-8309-503a22a896dc",
- "endToEndId": "E3524a995bbd54034b6d07c1c36014557",
- "correlationID": "788c8d0d-182b-468e-942e-546be6a621c2",
- "completedAt": "2026-08-13T23:52:51.629Z"
}, - "company": {
- "id": "6736a844b2554cc88e9d5124",
- "name": "ACME",
- "taxID": "44720743000101"
}
}A stablecoin payout did not go out.
| event required | string Value: "STABLECOIN_PAYOUT_FAILED" |
object | |
object Public company info. | |
| reason | string |
| errorCode | string |
{- "event": "STABLECOIN_PAYOUT_FAILED",
- "stablePayout": {
- "id": "68d40943069a28f8311395de",
- "status": "FAILED",
- "inputAmount": 1780,
- "inputCurrency": "USDC",
- "outputCurrency": "BRL",
- "pixKey": "67856db0-ac6e-4276-8309-503a22a896dc",
- "correlationID": "788c8d0d-182b-468e-942e-546be6a621c2",
- "failedAt": "2026-08-13T23:53:10.902Z"
}, - "company": {
- "id": "6736a844b2554cc88e9d5124",
- "name": "ACME",
- "taxID": "44720743000101"
}, - "reason": "pix key not found"
}A settled stablecoin payout was returned and the funds are available again in your stablecoin balance — safe to refund your end customer. stablePayout.status stays COMPLETED: the Pix did leave, so the return is reported under refund instead of rolling the status back. refund.providerTicketId is the return's own ticket and is the idempotency key; refund.amount is in cents of refund.currency (the input asset), never the BRL outputAmount.
| event required | string Value: "STABLECOIN_PAYOUT_REFUND_CONFIRMED" |
object | |
object Public company info. | |
object The returned money, as reported by the provider. |
{- "event": "STABLECOIN_PAYOUT_REFUND_CONFIRMED",
- "stablePayout": {
- "id": "68d40943069a28f8311395de",
- "status": "COMPLETED",
- "inputAmount": 3379,
- "inputCurrency": "BRLA",
- "outputAmount": 3373,
- "outputCurrency": "BRL",
- "pixKey": "67856db0-ac6e-4276-8309-503a22a896dc",
- "endToEndId": "E3524a995bbd54034b6d07c1c36014557",
- "correlationID": "788c8d0d-182b-468e-942e-546be6a621c2"
}, - "company": {
- "id": "6736a844b2554cc88e9d5124",
- "name": "ACME",
- "taxID": "44720743000101"
}, - "refund": {
- "status": "CONFIRMED",
- "amount": 3379,
- "currency": "BRLA",
- "destination": "SUBACCOUNT_BALANCE",
- "providerTicketId": "9a1c4f7e-2b83-4d55-9c0e-1f6a2d3b4c5d",
- "originalProviderTicketId": "018f2b2c-9a4d-4a6f-b0d5-7c9f1e2a3b44",
- "reason": "payout reversed - original ticket id: 018f2b2c-9a4d-4a6f-b0d5-7c9f1e2a3b44",
- "refundEndToEndId": "E54811417202608251402",
- "refundedAt": "2026-08-25T14:02:41.318Z"
}
}A settled stablecoin payout was returned but the funds are not available to you — do not credit your end customer, this needs reconciliation. Either the return leg itself did not land, or the credit is not withdrawable from your sub-account; refund.failureReason says which, and refund.destination is NONE when the money was not credited to the sub-account balance.
| event required | string Value: "STABLECOIN_PAYOUT_REFUND_FAILED" |
object | |
object Public company info. | |
object The returned money, as reported by the provider. |
{- "event": "STABLECOIN_PAYOUT_REFUND_FAILED",
- "stablePayout": {
- "id": "68d40943069a28f8311395de",
- "status": "COMPLETED",
- "inputAmount": 3379,
- "inputCurrency": "BRLA",
- "outputAmount": 3373,
- "outputCurrency": "BRL",
- "pixKey": "67856db0-ac6e-4276-8309-503a22a896dc",
- "endToEndId": "E3524a995bbd54034b6d07c1c36014557",
- "correlationID": "788c8d0d-182b-468e-942e-546be6a621c2"
}, - "company": {
- "id": "6736a844b2554cc88e9d5124",
- "name": "ACME",
- "taxID": "44720743000101"
}, - "refund": {
- "status": "FAILED",
- "amount": 3379,
- "currency": "BRLA",
- "destination": "NONE",
- "providerTicketId": "9a1c4f7e-2b83-4d55-9c0e-1f6a2d3b4c5d",
- "originalProviderTicketId": "018f2b2c-9a4d-4a6f-b0d5-7c9f1e2a3b44",
- "failureReason": "returned funds not available in the sub-account balance",
- "refundedAt": "2026-08-25T14:02:41.318Z"
}
}A stablecoin sub-account cleared onboarding and can transact.
| event required | string Value: "STABLECOIN_SUBACCOUNT_CONFIRMED" |
object | |
object Public company info. |
{- "event": "STABLECOIN_SUBACCOUNT_CONFIRMED",
- "stableSubAccount": {
- "id": "68d40943069a28f8311395df",
- "status": "CONFIRMED",
- "subAccountId": "6965563f1ad794345eb3ee3a",
- "accountRegisterId": "6a84929cb1bfe8079db8105e",
- "confirmedAt": "2026-08-19T20:42:20.971Z"
}, - "company": {
- "id": "6736a844b2554cc88e9d5124",
- "name": "ACME",
- "taxID": "44720743000101"
}
}A stablecoin sub-account was rejected. rejectionLabels carries the compliance labels when there are any.
| event required | string Value: "STABLECOIN_SUBACCOUNT_REJECTED" |
object | |
object Public company info. | |
| reason | string |
| rejectionLabels | Array of strings |
{- "event": "STABLECOIN_SUBACCOUNT_REJECTED",
- "stableSubAccount": {
- "id": "68d40943069a28f8311395df",
- "status": "REJECTED",
- "subAccountId": "6965563f1ad794345eb3ee3a",
- "accountRegisterId": "6a84929cb1bfe8079db8105e",
- "rejectedAt": "2026-08-19T20:42:21.712Z"
}, - "company": {
- "id": "6736a844b2554cc88e9d5124",
- "name": "ACME",
- "taxID": "44720743000101"
}, - "reason": "document mismatch",
- "rejectionLabels": [
- "DOCUMENT_MISMATCH"
]
}A Pix credit was received, either against a charge or against a static QR code. charge and pixQrCode are null when the Pix arrived with neither.
| event required | string Value: "OPENPIX:TRANSACTION_RECEIVED" |
WebhookCharge (object) or null | |
PixQrCode (object) or null | |
object | |
object | |
object | |
Array of objects (Refund) |
{- "event": "OPENPIX:TRANSACTION_RECEIVED",
- "charge": null,
- "pixQrCode": null,
- "pix": {
- "debitParty": {
- "account": {
- "branch": "1",
- "account": "123456789",
- "accountType": "TRAN"
}, - "psp": {
- "id": "12345678",
- "name": "BANCO PAGAMENTOS - IP"
}, - "holder": {
- "taxID": {
- "taxID": "12345678901",
- "type": "BR:CPF"
}, - "name": "Name Sobrenome"
}
}, - "creditParty": {
- "pixKey": {
- "pixKey": "1ed81f30-1654-5eaf3-b911-074449bad07e",
- "type": "RANDOM"
}, - "account": {
- "branch": "1",
- "account": "1234567",
- "accountType": "TRAN"
}, - "psp": {
- "id": "54811417",
- "name": "WOOVI IP LTDA."
}, - "holder": {
- "taxID": {
- "taxID": "01123456000199",
- "type": "BR:CNPJ"
}
}
}, - "payer": {
- "name": "Nome Sobrenome",
- "phone": "+5500988776655",
- "taxID": {
- "taxID": "98765432100",
- "type": "BR:CPF"
}, - "correlationID": "2566b5bd-2e1a-463d-b21c-ec7717cf2df4"
}, - "value": 200,
- "time": "2025-09-23T18:10:56.000Z",
- "endToEndId": "E18236120202509231810s56149dd987",
- "fee": 80,
- "status": "CONFIRMED",
- "type": "PAYMENT",
- "createdAt": "2025-09-23T18:10:56.657Z",
- "pixKey": "617126ef-3c13-4a4e-a8a4-05de07f3d8af",
- "globalID": "UGl4VHJhbnNhY3Rdf246NjhkMmUyYjB5OGI5ZjZkODYwNDVjMjg2"
}, - "company": {
- "id": "66f98ce2acbb5dffa956ff60",
- "name": "company name",
- "taxID": "12123456000199"
}, - "account": {
- "accountId": "68b999668bdbfg18agcca244",
- "branch": "0001",
- "account": "000000000000012345678",
- "taxID": "00123456000198"
}, - "refunds": [ ]
}Superseded by the PIX_TRANSACTION_REFUND_* events, which report the refund leg and its outcome separately.
| event required | string Value: "OPENPIX:TRANSACTION_REFUND_RECEIVED" |
object (WebhookCharge) The charge the event refers to. Superset of the fields observed across the charge and transaction events; a given event carries the subset that applies to it. | |
PixQrCode (object) or null | |
object | |
object | |
object | |
Array of objects (Refund) |
{- "event": "OPENPIX:TRANSACTION_REFUND_RECEIVED",
- "charge": {
- "customer": null,
- "value": 151,
- "comment": "",
- "identifier": "c37368e176894eea9b35fe0ea8ef2b7d",
- "transactionID": "c37368e176894eea9b35fe0ea8ef2b7d",
- "status": "COMPLETED",
- "additionalInfo": [ ],
- "giftbackAppliedValue": 0,
- "discount": 0,
- "valueWithDiscount": 151,
- "createdAt": "2022-09-16T13:57:26.300Z",
- "correlationID": "5e1f0740-4a18-4030-a5a7-686d3d8ec419",
- "paymentLinkID": "47478762-f0fb-4996-a972-519edae95681",
- "updatedAt": "2022-09-16T14:02:59.159Z",
- "expiresIn": 2591999,
- "pixKey": "c4249323-b4ca-43f2-8139-874baab09b93",
- "brCode": "00020101021226990014br.gov.bcb.pix2577pix-h.bpp.com.br/23114447/qrs1/v2/01jAVrYybMRhanrjbpgCDIxFrHxa7zdBSdcIinjmXbp52040000530398654041.515802BR5912Your_Company6009Sao_Paulo62290525c37368e176894eea9b35fe0ea63047E32",
- "globalID": "Q2hhcmdlOjYzMjQ4MGM4MDIxM2I4YTA2Y2FlYjAxZg=="
}, - "pixQrCode": null,
- "pix": {
- "customer": null,
- "value": 151,
- "time": "2022-09-16T14:15:39.597Z",
- "endToEndId": "D23114447202209161415HPf0GiKMeR4",
- "createdAt": "2022-09-16T14:15:41.909Z",
- "pixKey": "c4249323-b4ca-43f2-8139-874baab09b93",
- "partial": false,
- "globalID": "UGl4VHJhbnNhY3Rpb246NjMyNDg1MGQ3OTE4NTgxZDczOGNkZjg0"
}, - "company": {
- "id": "61240394529a1b71ee70d855",
- "name": "CASAS AMERICANAS",
- "taxID": "05460236000124"
}, - "account": {
- "clientId": "71034651-61E0-1FAD-4688-D967F095CFBF"
}, - "refunds": [ ]
}Endpoint to delete a Webhook
| id required | string Examples:
webhook ID |
const http = require('https'); const options = { method: 'DELETE', hostname: 'api.woovi.com', port: null, path: '/api/v1/webhook/Q2hhcmdlOjYwM2U3NDlhNDI1NjAyYmJiZjRlN2JlZA==', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "status": "string"
}| url | string Example: url=https://mycompany.com.br/webhook You can use the url to filter all webhooks |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/webhook?url=https%3A%2F%2Fmycompany.com.br%2Fwebhook', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "pageInfo": {
- "skip": 0,
- "limit": 100,
- "hasPreviousPage": false,
- "hasNextPage": true
}, - "webhooks": [
- {
- "id": "V2ViaG9vazo2MDNlYmUxZWRlYjkzNWU4NmQyMmNmMTg=",
- "name": "webhookName",
- "authorization": "openpix",
- "event": "OPENPIX:TRANSACTION_RECEIVED",
- "isActive": true,
- "createdAt": "2021-03-02T22:29:10.720Z",
- "updatedAt": "2021-03-02T22:29:10.720Z"
}, - {
- "id": "V2ViaG9vazo2MDNlYmUxZWRlYjkzNWU4NmQyMmNmOTk=",
- "name": "webhookName",
- "authorization": "openpix",
- "event": "OPENPIX:CHARGE_CREATED",
- "isActive": true,
- "createdAt": "2021-03-02T22:29:10.720Z",
- "updatedAt": "2021-03-02T22:29:10.720Z"
}
]
}Endpoint to create a new Webhook
Data to create a new webhook
object (WebhookPayload) | |||||||||||
| |||||||||||
{- "webhook": {
- "name": "webhookName",
- "event": "OPENPIX:CHARGE_CREATED",
- "authorization": "openpix",
- "isActive": true
}
}{- "webhook": {
- "id": "V2ViaG9vazo2MDNlYmUxZWRlYjkzNWU4NmQyMmNmMTg=",
- "name": "webhookName",
- "authorization": "openpix",
- "isActive": true,
- "event": "OPENPIX:TRANSACTION_RECEIVED",
- "createdAt": "2021-03-02T22:29:10.720Z",
- "updatedAt": "2021-03-02T22:29:10.720Z"
}
}{- "charge": {
- "status": "COMPLETED",
- "customer": {
- "name": "Julio",
- "phone": "5511999999999",
- "taxID": {
- "taxID": "31928282008",
- "type": "BR:CPF"
}, - "correlationID": "9134e286-6f71-427a-bf00-241681624586"
}, - "correlationID": "9134e286-6f71-427a-bf00-241681624586",
- "transactionID": "9134e2866f71427abf00241681624586",
- "brCode": "000201010212261060014br.gov.bcb.pix2584https://api.woovi.com/openpix/testing?transactionID=867ba5173c734202ac659721306b38c952040000530398654040.015802BR5909LOCALHOST6009Sao Paulo62360532867ba5173c734202ac659721306b38c963044BCA",
- "createdAt": "2021-03-03T20:49:23.605Z",
- "updatedAt": "2021-03-03T20:49:23.668Z"
}, - "pix": {
- "pixQrCode": null,
- "charge": {
- "status": "COMPLETED",
- "customer": "604002035cce3b60132343cb",
- "correlationID": "9134e286-6f71-427a-bf00-241681624586",
- "brCode": "000201010212261060014br.gov.bcb.pix2584https://api.woovi.com/openpix/testing?transactionID=867ba5173c734202ac659721306b38c952040000530398654040.015802BR5909LOCALHOST6009Sao Paulo62360532867ba5173c734202ac659721306b38c963044BCA",
- "createdAt": "2021-03-03T21:39:15.831Z",
- "updatedAt": "2021-03-03T21:39:15.896Z"
}, - "customer": {
- "name": "Julio",
- "phone": "5511999999999",
- "taxID": {
- "taxID": "31928282008",
- "type": "BR:CPF"
}, - "correlationID": "9134e286-6f71-427a-bf00-241681624586"
}, - "payer": {
- "name": "Julio",
- "phone": "5511999999999",
- "taxID": {
- "taxID": "31928282008",
- "type": "BR:CPF"
}, - "correlationID": "9134e286-6f71-427a-bf00-241681624586"
}, - "time": "2020-09-09T20:15:00.358Z",
- "value": 9999,
- "transactionID": "9134e2866f71427abf00241681624586",
- "infoPagador": "conta",
- "raw": {
- "endToEndId": "9134e2866f71427abf00241681624586",
- "txid": "9134e2866f71427abf00241681624586",
- "valor": "99.99",
- "horario": "2020-09-09T20:15:00.358Z",
- "infoPagador": "conta"
}
}, - "pixQrCode": null
}const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/webhook/events', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "events": [
- {
- "name": "OPENPIX:CHARGE_CREATED"
}, - {
- "name": "OPENPIX:TRANSACTION_RECEIVED"
}
]
}const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/webhook/ips', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "ips": [
- "189.51.60.9",
- "138.97.124.129",
- "177.71.136.66"
]
}Retorna a chave pública usada para verificar o header x-webhook-signature, presente em todo webhook enviado pela Woovi.
A assinatura é base64(RSA-SHA256) sobre o corpo bruto da request — verifique antes de fazer parse do JSON, porque reserializar muda os bytes e invalida a assinatura.
Este endpoint não exige autenticação: a chave é pública por definição, e quem recebe webhook normalmente valida a assinatura em um contexto que não tem o AppID em mãos.
A resposta é uma lista, e não uma chave só, para permitir rotação: durante uma troca de chave publicamos a antiga e a nova ao mesmo tempo, com is_current indicando qual está assinando agora. Aceite qualquer chave da lista ao verificar e você não quebra quando a rotação acontecer.
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/webhook/public-keys', headers: {} }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "public_keys": [
- {
- "key_identifier": "9dce618794f8986c603915a51b7029126c260e5cfdb2aa47e131d837fd62311c",
- "is_current": true,
- "key": "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/+NtIkjzevvqD+I3MMv3bLXDt\npvxBjY4BsRrSdca3rtAwMcRYYvxSnd7jagVLpctMiOxQO8ieUCKLSWHpsMAjO/zZ\nWMKbqoG8MNpi/u3fp6zz0mcHCOSqYsPUUG19buW8bis5ZZ2IZgBObWSpTvJ0cnj6\nHKBAA82Jln+lGwS1MwIDAQAB\n-----END PUBLIC KEY-----\n"
}
]
}| emv required | string Raw EMV / PIX QR payload (text) |
{- "emv": "00020126780014br.gov.bcb.pix0136f4c6089a-bfde-4c00-a2d9-9eaa584b02190216CobrancaEstatica5204000053039865406546.285802BR5903Pix6008BRASILIA6229052584767c56c2ab4e65b6670de2a80950014br.gov.bcb.pix2573qr-h.sandbox.pix.bcb.gov.br/rest/api/rec/4b62d4a088fe4f51bcb4c64cf078869163044486"
}{- "emv": {
- "payloadFormatIndicator": "01",
- "merchantAccountInformationPix": {
- "gui": "br.gov.bcb.pix",
- "pixKey": "f4c6089a-bfde-4c00-a2d9-9eaa584b0219",
- "additionalInformation": "CobrancaEstatica"
}, - "merchantCategoryCode": "0000",
- "transactionCurrency": "986",
- "transactionAmount": "546.28",
- "countryCode": "BR",
- "merchantName": "Pix",
- "merchantCity": "BRASILIA",
- "additionalDataFieldTemplate": {
- "referenceLabel": "84767c56c2ab4e65b6670de2a"
}, - "unreservedTemplates": {
- "gui": "br.gov.bcb.pix",
- "url": "qr-h.sandbox.pix.bcb.gov.br/rest/api/rec/4b62d4a088fe4f51bcb4c64cf0788691"
}, - "crc": "4486"
}, - "cobLocation": null,
- "recLocation": {
- "isValid": true,
- "locationErrors": [ ],
- "payload": {
- "updates": [
- {
- "date": "2025-10-24T18:42:58Z",
- "status": "CRIADA"
}
], - "calendar": {
- "startDate": "2025-10-24",
- "periodicity": "SEMANAL"
}, - "idRec": "RN5481141720251024BnwNHejs9h9",
- "retryPolicy": "NAO_PERMITE",
- "receiver": {
- "cnpj": "44720743000101",
- "participantIspb": "54811417",
- "name": "Woovi Demo"
}, - "value": {
- "valueRec": "0.01"
}, - "link": {
- "contract": "Woovi Demo - Pix Automático",
- "debtor": {
- "cpf": "15775023706",
- "name": "Pedro Cliente"
}
}
}, - "url": "qr-h.sandbox.pix.bcb.gov.br/rest/api/rec/4b62d4a088fe4f51bcb4c64cf0788691"
}
}| start | string Example: start=2021-01-01 |
| end | string Example: end=2021-01-01 |
| skip | number |
| limit | number Example: limit=100 |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/invoice?start=2021-01-01&end=2021-01-01&skip=0&limit=100', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "invoices": [
- {
- "id": "67001bbf0b0621890af7dc28",
- "value": 500,
- "date": "2024-10-04T16:45:51.058Z",
- "billingDate": "2024-10-04T16:45:51.058Z",
- "status": "CONFIRMED",
- "statusRaw": null,
- "correlationID": "INV-123",
- "customer": {
- "correlationID": "6f46c15a-f471-4d54-bb28-207fe2568f69",
- "name": "Gabriel"
}, - "charge": {
- "correlationID": "0c2df47d-4a90-4ef2-b04a-1f8673f1dbdd",
- "value": 500,
- "status": "COMPLETED",
- "paidAt": "2024-10-04T16:44:18.000Z",
- "date": "2024-10-04T16:43:20.931Z"
}
}
]
}| description | string |
| billingDate required | string <date-time> |
| correlationID required | string |
| charge | string |
| value required | number |
| customerId | string |
object |
{- "description": "string",
- "billingDate": "2019-08-24T14:15:22Z",
- "correlationID": "string",
- "charge": "string",
- "value": 0,
- "customerId": "string",
- "customer": {
- "taxID": "string",
- "name": "string",
- "phone": "string",
- "address": {
- "country": "string",
- "zipcode": "string",
- "street": "string",
- "number": "string",
- "state": "string"
}
}
}{- "invoice": {
- "id": "string",
- "value": 0,
- "date": "2019-08-24T14:15:22Z",
- "billingDate": "2019-08-24T14:15:22Z",
- "status": "string",
- "statusRaw": "string",
- "customer": {
- "correlationID": "string",
- "name": "string"
}, - "charge": {
- "correlationID": "string",
- "value": 0,
- "status": "string",
- "paidAt": "2019-08-24T14:15:22Z",
- "date": "2019-08-24T14:15:22Z"
}
}
}Uploads the company's NFe.io A1 certificate (base64-encoded pkcs12) to the configured NFEIO integration. The response returns only the resulting integration status and never echoes the certificate, passphrase or credentials.
| pcks12 required | string <byte> The A1 certificate (pkcs12) encoded as a base64 string |
| passphrase required | string The certificate password |
| test | boolean If true, the certificate is not uploaded to NFe.io (validation and upload are skipped) |
{- "pcks12": "string",
- "passphrase": "string",
- "test": true
}{- "integration": {
- "status": "string"
}
}const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/invoice/integration', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "integration": {
- "id": "67001bbf0b0621890af7dc28",
- "type": "NFEIO",
- "status": "CONFIGURED",
- "isActive": true,
- "metadata": {
- "nfeio": {
- "nfeioCompanyId": "nfeio-company-id",
- "cityServiceCode": "2690",
- "municipalSubscription": "123456",
- "taxRegime": "SimplesNacional"
}
}
}
}| isActive required | boolean |
{- "isActive": true
}{- "integration": {
- "id": "67001bbf0b0621890af7dc28",
- "type": "NFEIO",
- "status": "CONFIGURED",
- "isActive": true
}
}Upserts the NFe.io integration for the authenticated company and sets its tax fields. Optionally activates it (only allowed once configured).
| cityServiceCode | string |
| municipalSubscription | string |
| rpsNumber | string |
| specialTax | string |
| taxRegime | string |
| federalTaxDetermination | string |
| municipalTaxDetermination | string |
| isPortalNacional | boolean |
| isActive | boolean |
{- "cityServiceCode": "string",
- "municipalSubscription": "string",
- "rpsNumber": "string",
- "specialTax": "string",
- "taxRegime": "string",
- "federalTaxDetermination": "string",
- "municipalTaxDetermination": "string",
- "isPortalNacional": true,
- "isActive": true
}{- "integration": {
- "id": "67001bbf0b0621890af7dc28",
- "type": "NFEIO",
- "status": "CONFIGURING",
- "isActive": false,
- "metadata": {
- "nfeio": {
- "cityServiceCode": "2690",
- "municipalSubscription": "123456"
}
}
}
}Updates the tax configuration of the authenticated company's existing NFEIO integration (city service code, municipal subscription, rps number, special tax, tax regime, legal nature and tax determination fields). The integration must already exist; otherwise a 404 is returned. The response never echoes credentials.
| cityServiceCode | string |
| municipalSubscription | string |
| rpsNumber | string |
| specialTax | string |
| taxRegime | string |
| legalNature | string |
| federalTaxDetermination | string |
| municipalTaxDetermination | string |
| isPortalNacional | boolean |
{- "cityServiceCode": "string",
- "municipalSubscription": "string",
- "rpsNumber": "string",
- "specialTax": "string",
- "taxRegime": "string",
- "legalNature": "string",
- "federalTaxDetermination": "string",
- "municipalTaxDetermination": "string",
- "isPortalNacional": true
}{- "integration": { }
}Issues a test NFe.io invoice for the authenticated company's NFEIO integration. This is the bootstrap step that moves the integration to VALIDATING; once NFe.io confirms the test note via webhook the integration becomes CONFIGURED and active, which unblocks real invoice issuance. A configured integration can no longer issue test invoices.
const http = require('https'); const options = { method: 'POST', hostname: 'api.woovi.com', port: null, path: '/api/v1/invoice/integration/test', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
{- "invoice": {
- "id": "string"
}, - "integration": {
- "id": "string"
}
}Retrieves the statement/ledger entries for a company's bank account
| start | string <date-time> (Start Date) Example: start=2020-01-01T00:00:00Z Start date used in the query. Complies with RFC 3339. |
| end | string <date-time> (End Date) Example: end=2020-12-01T17:00:00Z End date used in the query. Complies with RFC 3339. |
| skip | number |
| limit | number |
| companyBankAccount | string Example: companyBankAccount=507f1f77bcf86cd799439011 Read the statement of another bank account of your company instead of the one linked to the appID. Only a MASTER application of a company with the MASTER_APP_READ_ANY_ACCOUNT feature can use it. Use the accountId returned by GET /api/v1/account. |
const http = require('https'); const options = { method: 'GET', hostname: 'api.woovi.com', port: null, path: '/api/v1/statement?start=2020-01-01T00%3A00%3A00Z&end=2020-12-01T17%3A00%3A00Z&skip=SOME_NUMBER_VALUE&limit=SOME_NUMBER_VALUE&companyBankAccount=507f1f77bcf86cd799439011', headers: { Authorization: '{APP_ID}' } }; const req = http.request(options, function (res) { const chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }); res.on('end', function () { const body = Buffer.concat(chunks); console.log(body.toString()); }); }); req.end();
[- {
- "id": "507f1f77bcf86cd799439011",
- "time": "2023-12-01T10:30:00.000Z",
- "description": "Payment received from customer",
- "balance": 1500.5,
- "value": 100,
- "type": "CREDIT",
- "transactionId": "txn_123456789"
}
]