O Sandbox da Malvo reproduz o ciclo de vida de um Item sem conectar contas reais e sem gerar cobrança. Ele inclui conectores mockados locais e pode incluir conectores AIS internacionais quando essa modalidade está habilitada no ambiente SANDBOX.
O Sandbox usa o mesmo host https://api.malvo.io; o isolamento vem de uma aplicação Malvo com environment: SANDBOX e seu próprio clientId/clientSecret. Não há subdomínio ou base URL de API separados.

Opt-in: como ligar o Sandbox

Uma aplicação SANDBOX enxerga somente conectores com isSandbox: true. Em listagens feitas com uma aplicação de produção, os mocks locais ficam ocultos por padrão e podem ser incluídos explicitamente para desenvolvimento. Os conectores PJ de Open Finance (8 e 20–22) são a exceção: só funcionam em aplicações SANDBOX, veja Empresas (PJ).
Mantenha sandbox/includeSandbox desligado em produção. Os conectores de sandbox só devem aparecer em ambientes de teste e desenvolvimento.

Conectores mockados locais

A faixa de IDs 0–99 é reservada para conectores locais de sandbox. Os ativos são 0 a 8 (conectores Malvo), 10 a 19 (bancos brasileiros de pessoa física) e 20 a 22 (bancos brasileiros de pessoa jurídica). Todos têm isSandbox: true. Os conectores 0–6 usam um fluxo de credenciais no campo parameters do POST /items — apenas para exercitar cenários de teste (MFA, conta conjunta, QR etc.) no sandbox. Os conectores 7 (pessoa física) e 8 (empresa) simulam o fluxo de redirecionamento do Open Finance, que é como todas as conexões de produção funcionam.

Credenciais default

Use estes valores para todos os conectores de fluxo básico: Qualquer password diferente de password-ok resulta em INVALID_CREDENTIALS → LOGIN_ERROR. Qualquer MFA token diferente de 123456 resulta em INVALID_CREDENTIALS_MFA.

Gatilhos por username

O username enviado controla o desfecho da execução. É assim que você reproduz, sob demanda, cada estado terminal do Item.

Testar uma conexão no sandbox

1

Liste os conectores de sandbox

Chame GET /connectors?sandbox=true para ver os conectores de sandbox e escolher o fluxo que quer testar.
2

Crie um Item com as credenciais de teste

Use o gatilho user-ok com a password default para uma conexão bem-sucedida no conector 0.
3

Responda ao MFA, se houver

Em conectores de MFA de duas etapas (ex. 4), o Item pausa em WAITING_USER_INPUT. Leia item.parameter para saber o campo esperado e envie o token default.
4

Faça polling até o estado final

Consulte GET /items/{id} (ou consuma webhooks) até o status sair de UPDATING/LOGIN_IN_PROGRESS. Com user-ok, o Item chega a UPDATED / SUCCESS e você já pode ler contas e transações.
5

Reproduza erros à vontade

Repita a criação trocando o username (user-locked, user-unavailable, user-error) para exercitar os caminhos de recuperação da sua integração.

Sandbox de Open Finance (conector 7)

O conector 7 simula o fluxo regulado de Open Finance, com redirecionamento e consentimento:
1

Informe apenas o CPF

O conector 7 não pede user/password no formulário inicial — apenas o CPF.
2

Autorize no banco mock

O usuário é redirecionado para a página de login de um banco mock. Use as credenciais do banco mock:
3

Volte pelo oauthRedirectUri

Após autorizar, o usuário é redirecionado de volta pelo oauthRedirectUri, o Item executa e chega a UPDATED. O fluxo exercita o consentimento completo: autorizar → redirect → executar.

Empresas (PJ)

Os conectores de empresa geram um dataset de pessoa jurídica: identidade com CNPJ e sócios, conta corrente empresarial e movimentações B2B com contrapartes estáveis, para você validar folha de pagamento, pagamento de fornecedores, recebimentos e conciliação antes de ir para produção.

Conectores PJ

Todos têm type: BUSINESS_BANK. Os conectores 8 e 20–22 pedem as mesmas credenciais dos conectores PJ de Open Finance de produção, com a mesma validação: Sem cnpj ou sem cpf, POST /items responde 400 com codeDescription VALIDATION_ERROR e a mesma mensagem da produção, por exemplo Parameter cnpj is required.
Os conectores 8 e 20–22 só funcionam em aplicações SANDBOX. Com uma aplicação PRODUCTION, eles não aparecem em GET /connectors (nem com sandbox=true/includeSandbox=true), GET /connectors/{id} responde 404, e POST /items, PATCH /items/{id} (inclusive com connectorId de um deles), POST /items/{id}/refresh e o Connect Widget respondem 400 com codeDescription CONNECTOR_NOT_SUPPORTED. Nenhum Item é criado. Um Item desses conectores que já exista numa aplicação PRODUCTION não sincroniza mais: a execução falha sem gravar dados e o Item vai para OUTDATED com error.code CONNECTOR_NOT_SUPPORTED.
No Connect Widget, os conectores 8 e 20–22 seguem o mesmo redirect simulado do conector 7. O conector 2 aceita os mesmos gatilhos por username dos demais conectores de fluxo básico.

Credenciais de teste

Use CNPJs e CPFs sintéticos com dígitos verificadores válidos. Estes servem para qualquer conector PJ: O CNPJ informado vira o document da identidade e o taxNumber da conta. Se ele tiver dígitos verificadores inválidos, o sandbox usa um CNPJ válido gerado para o Item. O CPF informado aparece entre os sócios em relations.

Porte da empresa

O porte define o tamanho da empresa simulada. Ele é escolhido pela ordem do CNPJ (os quatro dígitos depois da barra) ou, no conector legado 2, pelo sufixo do user: O porte também muda o volume diário de recebimentos e de vendas no cartão, o saldo médio, os valores de pró-labore, folha, fornecedores e empréstimos, e os tributos gerados.

Dados gerados

Tudo é determinístico por Item: os mesmos sócios, funcionários, fornecedores e clientes aparecem todo mês, com os mesmos documentos e dados bancários, e os ids seguem as regras de IDs estáveis.

Movimentações da conta

Seguem a convenção de sinal da conta: débito negativo, crédito positivo.
Os valores de tributos são sintéticos: percentuais fixos sobre a folha e a receita do mês anterior, só para que a conciliação tenha lançamentos realistas. Eles não são cálculo tributário.
As parcelas de capital de giro têm o mesmo valor e o mesmo contractNumber do empréstimo em GET /loans. O pagamento da fatura tem o mesmo valor e data do payments da fatura em GET /bills.

paymentData

Toda movimentação PIX, TED ou BOLETO traz paymentData.payer e paymentData.receiver. Um dos lados é a própria empresa e o outro é a contraparte. Cada participante tem: Boletos trazem paymentData.boletoMetadata com barcode (44 dígitos), digitableLine (47 dígitos) e baseAmount. Os tributos CONVENIO_ARRECADACAO (DAS e DARF) não têm payer nem receiver: trazem só boletoMetadata.barcode (44 dígitos) e digitableLine (48 dígitos) de arrecadação. A GFD do FGTS Digital é recolhida só por Pix (Portaria MTE nº 240/2024, art. 27). No sandbox, ela vem como PIX, sem boletoMetadata: o payer é a empresa e o receiver é a Caixa Econômica Federal, agente operador do FGTS, com CNPJ, COMPE e ISPB, sem agência e conta. Nenhuma guia ou pagamento real é gerado.
Os nomes, documentos e valores dos exemplos variam de Item para Item. Os documentos são sintéticos e não pertencem a pessoas ou empresas reais, exceto os CNPJs públicos das adquirentes.

Dias úteis

Os tributos, os fornecedores, os recebimentos e as tarifas seguem os dias úteis bancários: não caem em sábados, domingos, feriados nacionais (inclusive 20 de novembro, desde 2024), Carnaval (segunda e terça), Sexta-feira Santa e Corpus Christi. A folha segue o prazo salarial: até o 5º dia útil do mês seguinte ao trabalhado (CLT, art. 459, § 1º). Nessa contagem o sábado é dia útil (MTE, dúvidas frequentes); domingos e feriados nacionais (inclusive Sexta-feira Santa) não contam, e Carnaval e Corpus Christi contam. O salário por PIX cai no próprio 5º dia útil, mesmo num sábado. Como TED só liquida em dia útil bancário, salários por TED e o pró-labore são antecipados para o último dia útil bancário até o prazo. Em setembro de 2026, o 5º dia útil é sábado, 05/09: os PIX saem em 05/09 e as TED em sexta, 04/09. Feriados estaduais e municipais não são considerados.

Sandbox internacional

Quando o ambiente internacional está em modo SANDBOX, o catálogo inclui ASPSPs de simulação. Eles aparecem como conectores isOpenFinance: true, isSandbox: true, sem credenciais bancárias no objeto e com os produtos ACCOUNTS e TRANSACTIONS.
O sandbox internacional contém apenas uma amostra de ASPSPs e pode ter limitações ou instabilidades próprias de cada banco. Ele valida assinatura RSA, redirect, sessão, paginação e mapeamento de dados, mas não comprova a cobertura nem o comportamento de produção. Descubra a lista em runtime e não copie IDs do sandbox para produção.

Ciclo do cartão de crédito no sandbox

Os conectores mockados locais geram cartões com um ciclo de fatura fixo, no fuso America/Sao_Paulo:

Ciclo aberto e ciclo fechado

Quando o ciclo fecha, as mesmas transações (mesmo id) passam de PENDING para POSTED e recebem o billId. A transição dispara o webhook transactions/updated. O Bill.totalAmount é a soma dos amount das transações do ciclo, com compras positivas e pagamentos ou estornos negativos, conforme a convenção de sinal do cartão. Por exemplo, uma compra de 173.90 e um estorno de -10.00 no mesmo ciclo dão totalAmount: 163.90. Isso segue o Open Finance Brasil: só uma fatura já fechada é informada (Credit Cards API 2.4.0-beta.1, GET /accounts/{creditCardAccountId}/bills; PRD de Cartão de Crédito v2.4.0, §3.4.1).
Diferença em relação a produção. Em produção, as transações PENDING de cartão vêm da janela de transações correntes, que cobre só os últimos 7 dias. No sandbox, todo o ciclo aberto aparece como PENDING, do dia seguinte ao último fechamento até hoje. Não use o sandbox para testar o comportamento da janela de 7 dias.

Fechar a fatura agora

Para não esperar o dia 8, feche o ciclo aberto sob demanda com POST /items/{id}/sandbox/close-bill. A chamada usa o mesmo X-API-KEY do POST /items/{id}/refresh e não tem corpo.
A resposta 200 traz o Item, como no refresh. O calendário simulado do Item avança até o dia seguinte ao próximo fechamento (dia 9) e uma sincronização entra na fila. Quando ela termina:
  • as transações do ciclo que estava aberto ficam POSTED, com o billId da nova fatura, e você recebe transactions/updated;
  • a nova fatura aparece em GET /bills?accountId={accountId}.
Cada chamada fecha mais um ciclo: a primeira avança até o dia 9 do mês do próximo fechamento, a segunda até o dia 9 do mês seguinte, e assim por diante. O avanço vale para todo o calendário do Item, então os dias entre hoje e o dia 9 também aparecem na sincronização, com os mesmos ids que teriam quando esses dias chegassem. Os erros usam o envelope padrão da API: code é o status HTTP numérico, codeDescription traz o identificador da tabela e requestId identifica a requisição. Por exemplo, com uma aplicação PRODUCTION:

IDs estáveis e janela de 365 dias

  • O refresh (POST /items/{id}/refresh) e a sincronização automática não criam id novo para uma transação que já existe. Rodar de novo no mesmo dia não cria transações; no dia seguinte, só as transações do novo dia são criadas.
  • Cada sincronização emite as transações dos últimos 365 dias. Uma transação que sai dessa janela continua gravada e pode ser lida normalmente.

Valores em reais

amount, creditCardMetadata.totalAmount e Bill.totalAmount são números decimais em reais, com até duas casas. R$ 173,90 (17.390 centavos) chega no JSON como 173.90, e não como o inteiro 17390. A unidade é a mesma no sandbox e em produção. Em produção, um valor que a instituição envia como "184.2700" chega como 184.27.

O que o sandbox não simula

  • A janela de 7 dias das transações correntes de cartão em produção (veja a nota acima).

Garantias do Sandbox

O Sandbox nunca gera cobrança. Nenhuma chamada a conector de sandbox toca em bancos reais nem na rede de Open Finance, e nada é faturado.
  • Items de sandbox inativos por mais de 30 dias são permanentemente removidos por garbage collection. Não conte com a persistência de longo prazo de Items de teste.
  • Não há ITP, pagamentos ou iniciação de qualquer tipo no Sandbox — assim como na API de produção, esses recursos não existem na Malvo.

Próximos passos

Connectors

A convenção de IDs e o shape do objeto Connector.

Items

A máquina de estados e os caminhos de recuperação que você vai exercitar no sandbox.

Connect Widget

Ative includeSandbox para testar o fluxo completo na UI.

Quickstart

Conecte um banco de teste de ponta a ponta em minutos.