Início

Introdução à API SafeSplit

Bem-vindo à documentação da API SafeSplit. Aqui você encontrará tudo que precisa para integrar pagamentos PIX instantâneos em sua aplicação.

API RESTful

Nossa API segue os padrões REST e retorna respostas em JSON. Todas as requisições devem usar HTTPS.

Visão Geral

A API SafeSplit permite que você crie cobranças PIX, receba notificações de pagamento em tempo real via webhooks, e realize transferências (payouts) para qualquer chave PIX.

Pagamento Instantâneo

Confirmação em segundos, disponível 24/7

Webhooks em Tempo Real

Notificações instantâneas de eventos

Segurança

Assinatura HMAC em todas requisições

SDKs Disponíveis

PHP, Node.js, Python e mais

Ambientes

A SafeSplit oferece dois ambientes para integração:

Ambiente URL Base Descrição
Sandbox https://sandbox.safesplit.com.br/api/v1 Ambiente de testes. Use para desenvolvimento e homologação.
Produção https://api.safesplit.com.br/api/v1 Ambiente de produção. Transações reais.
Importante

Sempre teste sua integração no ambiente Sandbox antes de ir para produção. As credenciais são diferentes para cada ambiente.

Fluxo Básico de Integração

O processo de integração segue um fluxo simples:

1

Criar Conta

Registre-se na SafeSplit e obtenha suas credenciais de API (Client ID e Client Secret).

2

Configurar Webhook

Configure a URL de webhook no painel para receber notificações de pagamento.

3

Criar Cobrança

Use a API para gerar cobranças PIX e exiba o QR Code para seus clientes.

4

Receber Pagamento

Quando o cliente pagar, você recebe um webhook com a confirmação.

Segurança

Autenticação

Todas as requisições à API SafeSplit devem ser autenticadas usando suas credenciais de API.

Credenciais de API

Após criar sua conta, você receberá duas credenciais:

Credencial Descrição Exemplo
Client ID Identificador público da sua conta safesplit_cid_a1b2c3d4e5f6
Client Secret Chave secreta para autenticação safesplit_sec_x9y8z7w6v5u4...
Nunca exponha seu Client Secret!

Mantenha seu Client Secret seguro. Nunca o compartilhe ou exponha em código client-side (JavaScript no navegador).

Headers de Autenticação

Inclua suas credenciais em todas as requisições usando os headers:

Headers HTTP
X-Client-Id: seu_client_id
X-Client-Secret: seu_client_secret
Content-Type: application/json
Accept: application/json

Exemplo de Requisição Autenticada

cURL
curl -X GET "https://api.safesplit.com.br/api/v1/charges" \
  -H "X-Client-Id: seu_client_id" \
  -H "X-Client-Secret: seu_client_secret" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json"
PHP
<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => "https://api.safesplit.com.br/api/v1/charges",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "X-Client-Id: seu_client_id",
        "X-Client-Secret: seu_client_secret",
        "Content-Type: application/json",
        "Accept: application/json"
    ],
]);

$response = curl_exec($curl);
$data = json_decode($response, true);

curl_close($curl);
Node.js
const axios = require('axios');

const response = await axios.get('https://api.safesplit.com.br/api/v1/charges', {
    headers: {
        'X-Client-Id': 'seu_client_id',
        'X-Client-Secret': 'seu_client_secret',
        'Content-Type': 'application/json',
        'Accept': 'application/json'
    }
});

console.log(response.data);
Python
import requests

headers = {
    'X-Client-Id': 'seu_client_id',
    'X-Client-Secret': 'seu_client_secret',
    'Content-Type': 'application/json',
    'Accept': 'application/json'
}

response = requests.get(
    'https://api.safesplit.com.br/api/v1/charges',
    headers=headers
)

data = response.json()

Rotação de Credenciais

Por segurança, recomendamos rotacionar suas credenciais periodicamente. Você pode gerar novas credenciais no painel do merchant em Configurações → API.

Dica

Ao gerar novas credenciais, as antigas continuam válidas por 24 horas para evitar interrupções.

POST

Criar Cobrança PIX

Crie uma cobrança PIX e receba o QR Code para pagamento.

POST /api/v1/charges

Parâmetros do Body

Parâmetro Tipo Obrigatório Descrição
amount integer Sim Valor em centavos. Ex: 1000 = R$ 10,00
description string Sim Descrição da cobrança (máx. 255 caracteres)
external_id string Não ID de referência do seu sistema
expires_in integer Não Tempo de expiração em minutos (padrão: 60)
customer object Não Dados do cliente (nome, email, document)
metadata object Não Dados adicionais em formato chave-valor

Exemplo de Requisição

Request Body
{
    "amount": 15000,
    "description": "Pedido #12345 - Loja Virtual",
    "external_id": "order_12345",
    "expires_in": 30,
    "customer": {
        "name": "João da Silva",
        "email": "joao@email.com",
        "document": "12345678900"
    },
    "metadata": {
        "order_id": "12345",
        "product": "Camiseta Azul"
    }
}

Exemplo de Resposta

Response - 201 Created
{
    "success": true,
    "data": {
        "uuid": "chg_a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "amount": 15000,
        "amount_formatted": "R$ 150,00",
        "status": "pending",
        "description": "Pedido #12345 - Loja Virtual",
        "external_id": "order_12345",
        "pix_key": "00020126580014br.gov.bcb.pix...",
        "pix_qrcode": "data:image/png;base64,iVBORw0KGgo...",
        "pix_qrcode_url": "https://api.safesplit.com.br/qr/chg_a1b2c3d4...",
        "expires_at": "2026-01-15T15:30:00.000Z",
        "created_at": "2026-01-15T15:00:00.000Z"
    }
}

Exibindo o QR Code

O campo pix_qrcode contém o QR Code em formato Base64, pronto para ser exibido:

HTML
<img src="{{ $charge->pix_qrcode }}" alt="QR Code PIX" />

<!-- Ou usando a URL direta -->
<img src="{{ $charge->pix_qrcode_url }}" alt="QR Code PIX" />
GET

Consultar Cobrança

Consulte os detalhes e status de uma cobrança específica.

GET /api/v1/charges/{uuid}

Parâmetros de URL

Parâmetro Tipo Descrição
uuid string UUID da cobrança retornado na criação

Exemplo de Resposta

Response - 200 OK
{
    "success": true,
    "data": {
        "uuid": "chg_a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "amount": 15000,
        "status": "paid",
        "paid_at": "2026-01-15T15:05:32.000Z",
        "payer": {
            "name": "João da Silva",
            "document": "***456789**"
        }
    }
}

Status Possíveis

Status Descrição
pending Aguardando pagamento
paid Pagamento confirmado
expired Cobrança expirada
cancelled Cobrança cancelada
refunded Pagamento devolvido
GET

Listar Cobranças

Liste todas as cobranças da sua conta com filtros e paginação.

GET /api/v1/charges

Query Parameters

Parâmetro Tipo Descrição
status string Filtrar por status (pending, paid, expired, cancelled)
start_date date Data inicial (formato: YYYY-MM-DD)
end_date date Data final (formato: YYYY-MM-DD)
page integer Página da listagem (padrão: 1)
per_page integer Itens por página (padrão: 20, máx: 100)

Exemplo

cURL
curl -X GET "https://api.safesplit.com.br/api/v1/charges?status=paid&start_date=2026-01-01&per_page=50" \
  -H "X-Client-Id: seu_client_id" \
  -H "X-Client-Secret: seu_client_secret"
DELETE

Cancelar Cobrança

Cancele uma cobrança pendente.

DELETE /api/v1/charges/{uuid}
Atenção

Apenas cobranças com status pending podem ser canceladas.

Exemplo de Resposta

Response - 200 OK
{
    "success": true,
    "message": "Cobrança cancelada com sucesso",
    "data": {
        "uuid": "chg_a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "status": "cancelled",
        "cancelled_at": "2026-01-15T15:10:00.000Z"
    }
}
Notificações

Webhooks

Receba notificações em tempo real sobre eventos na sua conta, como pagamentos confirmados.

Configuração

Configure a URL de webhook no painel do merchant em Configurações → Webhooks. Você pode configurar diferentes URLs para cada tipo de evento.

Requisitos da URL

Sua URL de webhook deve usar HTTPS e responder com status 200 em até 30 segundos.

Estrutura do Webhook

Todos os webhooks são enviados via POST com o seguinte formato:

Webhook Payload
{
    "event": "charge.paid",
    "timestamp": "2026-01-15T15:05:32.000Z",
    "data": {
        "uuid": "chg_a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "amount": 15000,
        "status": "paid",
        "external_id": "order_12345",
        "paid_at": "2026-01-15T15:05:32.000Z",
        "payer": {
            "name": "João da Silva",
            "document": "***456789**"
        }
    }
}

Eventos Disponíveis

Evento Descrição
charge.created Nova cobrança criada
charge.paid Pagamento confirmado
charge.expired Cobrança expirou sem pagamento
charge.cancelled Cobrança foi cancelada
charge.refunded Pagamento foi devolvido
payout.created Novo payout criado
payout.completed Payout concluído com sucesso
payout.failed Payout falhou

Segurança - Validando Webhooks

Todos os webhooks incluem uma assinatura HMAC-SHA256 no header X-Webhook-Signature. Sempre valide essa assinatura para garantir que o webhook veio da SafeSplit.

Headers do Webhook

Headers
Content-Type: application/json
X-Webhook-Signature: sha256=a1b2c3d4e5f6...
X-Webhook-Timestamp: 1705330532
X-Webhook-Id: whk_a1b2c3d4e5f6

Validando a Assinatura

PHP
<?php

function validateWebhook($payload, $signature, $secret) {
    $expectedSignature = 'sha256=' . hash_hmac('sha256', $payload, $secret);
    return hash_equals($expectedSignature, $signature);
}

// Recebendo o webhook
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
$webhookSecret = 'seu_webhook_secret';

if (!validateWebhook($payload, $signature, $webhookSecret)) {
    http_response_code(401);
    exit('Assinatura inválida');
}

// Processar o webhook
$data = json_decode($payload, true);
$event = $data['event'];

switch ($event) {
    case 'charge.paid':
        // Pagamento confirmado!
        $chargeId = $data['data']['uuid'];
        $externalId = $data['data']['external_id'];
        // Atualizar seu pedido...
        break;
}

http_response_code(200);
echo json_encode(['received' => true]);
Node.js (Express)
const crypto = require('crypto');
const express = require('express');
const app = express();

app.use('/webhook', express.raw({ type: 'application/json' }));

function validateWebhook(payload, signature, secret) {
    const expectedSignature = 'sha256=' + 
        crypto.createHmac('sha256', secret)
              .update(payload)
              .digest('hex');
    
    return crypto.timingSafeEqual(
        Buffer.from(expectedSignature),
        Buffer.from(signature)
    );
}

app.post('/webhook', (req, res) => {
    const signature = req.headers['x-webhook-signature'];
    const webhookSecret = 'seu_webhook_secret';
    
    if (!validateWebhook(req.body, signature, webhookSecret)) {
        return res.status(401).send('Assinatura inválida');
    }
    
    const data = JSON.parse(req.body);
    
    switch (data.event) {
        case 'charge.paid':
            console.log('Pagamento confirmado:', data.data.uuid);
            // Processar pagamento...
            break;
    }
    
    res.json({ received: true });
});
Python (Flask)
import hmac
import hashlib
from flask import Flask, request, jsonify

app = Flask(__name__)

def validate_webhook(payload, signature, secret):
    expected = 'sha256=' + hmac.new(
        secret.encode(),
        payload,
        hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, signature)

@app.route('/webhook', methods=['POST'])
def webhook():
    signature = request.headers.get('X-Webhook-Signature', '')
    webhook_secret = 'seu_webhook_secret'
    
    if not validate_webhook(request.data, signature, webhook_secret):
        return 'Assinatura inválida', 401
    
    data = request.json
    event = data['event']
    
    if event == 'charge.paid':
        charge_id = data['data']['uuid']
        # Processar pagamento...
    
    return jsonify({'received': True})

Retentativas

Se seu endpoint não retornar um status 2xx, tentaremos novamente:

  • 1ª tentativa: imediatamente
  • 2ª tentativa: após 5 minutos
  • 3ª tentativa: após 30 minutos
  • 4ª tentativa: após 2 horas
  • 5ª tentativa: após 24 horas
Importante

Implemente idempotência no seu handler de webhook. O mesmo evento pode ser enviado mais de uma vez.

POST

Criar Payout (Transferência)

Envie dinheiro para qualquer chave PIX de forma instantânea.

POST /api/v1/payouts
Saldo Necessário

Você precisa ter saldo disponível na sua conta SafeSplit para realizar payouts.

Parâmetros do Body

Parâmetro Tipo Obrigatório Descrição
amount integer Sim Valor em centavos
pix_key_type string Sim Tipo da chave: cpf, cnpj, email, phone, random
pix_key string Sim Chave PIX do destinatário
description string Não Descrição da transferência
external_id string Não ID de referência do seu sistema

Tipos de Chave PIX

Tipo Formato Exemplo
cpf 11 dígitos 12345678900
cnpj 14 dígitos 12345678000199
email E-mail válido joao@email.com
phone +55 + DDD + número +5511999998888
random Chave aleatória a1b2c3d4-e5f6-7890-abcd...

Exemplo de Requisição

Request Body
{
    "amount": 50000,
    "pix_key_type": "cpf",
    "pix_key": "12345678900",
    "description": "Pagamento de comissão",
    "external_id": "commission_001"
}

Exemplo de Resposta

Response - 201 Created
{
    "success": true,
    "data": {
        "uuid": "pay_x9y8z7w6-v5u4-t3s2-r1q0-p9o8n7m6l5k4",
        "amount": 50000,
        "amount_formatted": "R$ 500,00",
        "status": "processing",
        "pix_key_type": "cpf",
        "pix_key": "***456789**",
        "description": "Pagamento de comissão",
        "external_id": "commission_001",
        "created_at": "2026-01-15T15:00:00.000Z"
    }
}
GET

Consultar Payout

Consulte o status de uma transferência.

GET /api/v1/payouts/{uuid}

Exemplo de Resposta

Response - 200 OK
{
    "success": true,
    "data": {
        "uuid": "pay_x9y8z7w6-v5u4-t3s2-r1q0-p9o8n7m6l5k4",
        "amount": 50000,
        "status": "completed",
        "pix_key_type": "cpf",
        "pix_key": "***456789**",
        "recipient": {
            "name": "Maria Santos",
            "bank": "Banco do Brasil"
        },
        "completed_at": "2026-01-15T15:00:05.000Z",
        "end_to_end_id": "E12345678202601151500..."
    }
}

Status Possíveis

Status Descrição
pending Aguardando processamento
processing Em processamento no banco
completed Transferência concluída
failed Falha na transferência

Ambiente Sandbox

O Sandbox permite testar sua integração sem processar pagamentos reais. Todas as funcionalidades estão disponíveis, mas nenhum dinheiro é movimentado.

Recomendação: Sempre desenvolva e teste sua integração primeiro no ambiente sandbox antes de ativar em produção.

Ativando o Sandbox

Para usar o ambiente sandbox:

  1. Acesse o Painel do Merchant
  2. Vá em Sandbox no menu lateral
  3. Clique em "Ativar Sandbox"
  4. Copie as credenciais geradas (sandbox_client_id e sandbox_client_secret)
Importante: As credenciais sandbox são diferentes das credenciais de produção. Nunca misture os ambientes.

Credenciais

No modo sandbox, você receberá credenciais específicas:

Campo Formato Uso
sandbox_client_id sandbox_xxxxxxxxxx Identificação (opcional)
sandbox_client_secret sk_sandbox_xxxxxxxxxx Token Bearer para autenticação

Use o sandbox_client_secret no header Authorization:

# Request no ambiente sandbox
curl -X POST https://safesplit.com.br/api/v1/charges \
  -H "Authorization: Bearer sk_sandbox_seu_token_aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "amount_cents": 1000,
    "description": "Cobrança de teste"
  }'

Comportamento no Sandbox

O que funciona normalmente
  • Criação de cobranças
  • Criação de saques
  • QR Code gerado (simulado)
  • Webhooks enviados
  • Todas as validações
  • Eventos e logs
O que é simulado
  • Pagamentos Pix (não geram transação real)
  • Transferências de saque
  • Confirmações bancárias
  • Saldo da conta (valores fictícios)

Simulando Pagamentos

No sandbox, você pode simular o pagamento de uma cobrança de duas formas:

1. Via Painel

Acesse Sandbox no painel e clique em "Pagar" na cobrança desejada.

2. Via API

# Simular pagamento de cobrança
POST /api/v1/sandbox/charges/{uuid}/pay

# Simular expiração de cobrança
POST /api/v1/sandbox/charges/{uuid}/expire

# Simular conclusão de saque
POST /api/v1/sandbox/payouts/{uuid}/complete

# Simular falha de saque
POST /api/v1/sandbox/payouts/{uuid}/fail
Exemplo: Simular Pagamento
# Simular pagamento de uma cobrança
curl -X POST https://safesplit.com.br/api/v1/sandbox/charges/550e8400-e29b-41d4-a716-446655440000/pay \
  -H "Authorization: Bearer sk_sandbox_seu_token" \
  -H "Content-Type: application/json"
Resposta
{
  "success": true,
  "message": "Pagamento simulado com sucesso. Webhooks serão enviados normalmente.",
  "simulation": {
    "type": "charge_paid",
    "payer": {
      "payer_name": "João Silva",
      "payer_document": "123.456.789-00",
      "payer_bank_name": "Nubank",
      "payer_bank_ispb": "18236120"
    }
  },
  "charge": {
    "uuid": "550e8400-e29b-41d4-a716-446655440000",
    "status": "paid",
    "amount_cents": 1000,
    "paid_at": "2024-01-15T10:30:00Z"
  }
}

Valores Especiais para Testes

Use valores específicos para simular diferentes cenários:

Valor (centavos) Valor (reais) Comportamento
1 R$ 0,01 Erro Simula falha de pagamento ou saque recusado
2 R$ 0,02 Timeout Simula timeout ou operação pendente
66600 R$ 666,00 Parcial Simula pagamento parcial (metade do valor)
Qualquer outro - Sucesso Operação bem sucedida
# Criar cobrança que simulará erro no pagamento
curl -X POST https://safesplit.com.br/api/v1/charges \
  -H "Authorization: Bearer sk_sandbox_seu_token" \
  -H "Content-Type: application/json" \
  -d '{
    "amount_cents": 1,
    "description": "Teste de erro"
  }'

Webhooks no Sandbox

Os webhooks funcionam normalmente no sandbox. Configure uma URL específica para receber os webhooks de teste:

  1. Acesse Sandbox no painel
  2. Configure o campo Webhook URL (Sandbox)
  3. Todos os eventos gerados no sandbox serão enviados para essa URL
Dica: Use serviços como webhook.site ou RequestBin para inspecionar webhooks durante o desenvolvimento.

Endpoints Disponíveis

Método Endpoint Descrição
GET /api/v1/sandbox/status Verifica status do sandbox e features disponíveis
POST /api/v1/sandbox/credentials/regenerate Regenera credenciais sandbox
POST /api/v1/sandbox/charges/{uuid}/pay Simula pagamento de cobrança
POST /api/v1/sandbox/charges/{uuid}/expire Simula expiração de cobrança
POST /api/v1/sandbox/payouts/{uuid}/complete Simula conclusão de saque
POST /api/v1/sandbox/payouts/{uuid}/fail Simula falha de saque

Boas Práticas

Faça
  • Teste todos os cenários antes de ir para produção
  • Configure uma URL de webhook para testes
  • Use valores especiais para testar erros
  • Mantenha credenciais sandbox separadas
  • Valide a assinatura dos webhooks
Não Faça
  • Usar credenciais sandbox em produção
  • Expor o sandbox_client_secret
  • Ignorar erros durante os testes
  • Deixar o sandbox ativo em produção
  • Testar com dados de clientes reais
Referência

Códigos de Erro

Lista de erros que podem ser retornados pela API e como tratá-los.

Estrutura do Erro

Quando ocorre um erro, a API retorna um objeto JSON com os detalhes:

Exemplo de Erro
{
    "success": false,
    "error": {
        "code": "validation_error",
        "message": "Os dados fornecidos são inválidos",
        "details": {
            "amount": ["O campo amount é obrigatório"],
            "description": ["O campo description deve ter no máximo 255 caracteres"]
        }
    }
}

Códigos HTTP

Código Status Descrição
200 OK Requisição bem-sucedida
201 Created Recurso criado com sucesso
400 Bad Request Requisição malformada ou parâmetros inválidos
401 Unauthorized Credenciais inválidas ou ausentes
403 Forbidden Sem permissão para acessar o recurso
404 Not Found Recurso não encontrado
422 Unprocessable Entity Erro de validação nos dados
429 Too Many Requests Limite de requisições excedido
500 Internal Server Error Erro interno do servidor

Códigos de Erro da API

Código Descrição Ação Recomendada
invalid_credentials Credenciais de API inválidas Verifique seu Client ID e Client Secret
validation_error Dados inválidos na requisição Verifique os campos indicados em "details"
resource_not_found Recurso não encontrado Verifique o UUID informado
insufficient_balance Saldo insuficiente para payout Adicione saldo à sua conta
charge_already_paid Cobrança já foi paga Não é possível modificar cobranças pagas
charge_expired Cobrança expirada Crie uma nova cobrança
invalid_pix_key Chave PIX inválida Verifique o formato da chave PIX
pix_key_not_found Chave PIX não encontrada A chave PIX não existe no DICT
rate_limit_exceeded Limite de requisições excedido Aguarde antes de fazer novas requisições
merchant_inactive Conta merchant inativa Entre em contato com o suporte

Rate Limiting

A API possui limites de requisições para garantir estabilidade:

Plano Limite por Minuto Limite por Hora
Starter 60 requisições 1.000 requisições
Profissional 300 requisições 10.000 requisições
Enterprise Ilimitado* Ilimitado*

Os headers de resposta incluem informações sobre o limite:

Rate Limit Headers
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1705330600
Bibliotecas

SDKs e Bibliotecas

Use nossos SDKs oficiais para integrar mais rapidamente.

PHP SDK

v2.0.0

Para aplicações Laravel, Symfony, WordPress e PHP puro.

Instalação
composer require safesplit/safesplit-php
Ver no GitHub

Node.js SDK

v2.0.0

Para aplicações Express, NestJS, Next.js e Node.js.

Instalação
npm install @safesplit/sdk
Ver no GitHub

Python SDK

v2.0.0

Para aplicações Django, Flask, FastAPI e Python.

Instalação
pip install safesplit
Ver no GitHub

Ruby SDK

v1.0.0

Para aplicações Ruby on Rails e Sinatra.

Instalação
gem install safesplit
Ver no GitHub

Exemplo de Uso - PHP SDK

PHP
<?php

use SafeSplit\SafeSplit;
use SafeSplit\Exceptions\SafeSplitException;

// Inicializar o cliente
$safesplit = new SafeSplit([
    'client_id' => 'seu_client_id',
    'client_secret' => 'seu_client_secret',
    'environment' => 'sandbox' // ou 'production'
]);

// Criar uma cobrança
try {
    $charge = $safesplit->charges->create([
        'amount' => 15000, // R$ 150,00
        'description' => 'Pedido #12345',
        'external_id' => 'order_12345',
        'customer' => [
            'name' => 'João da Silva',
            'email' => 'joao@email.com',
            'document' => '12345678900'
        ]
    ]);
    
    echo "QR Code: " . $charge->pix_qrcode;
    echo "Código PIX: " . $charge->pix_key;
    
} catch (SafeSplitException $e) {
    echo "Erro: " . $e->getMessage();
}

// Consultar cobrança
$charge = $safesplit->charges->find('chg_a1b2c3d4...');
echo "Status: " . $charge->status;

// Criar payout
$payout = $safesplit->payouts->create([
    'amount' => 50000,
    'pix_key_type' => 'cpf',
    'pix_key' => '12345678900'
]);

Exemplo de Uso - Node.js SDK

Node.js
const { SafeSplit } = require('@safesplit/sdk');

// Inicializar o cliente
const safesplit = new SafeSplit({
    clientId: 'seu_client_id',
    clientSecret: 'seu_client_secret',
    environment: 'sandbox' // ou 'production'
});

// Criar uma cobrança
async function createCharge() {
    try {
        const charge = await safesplit.charges.create({
            amount: 15000, // R$ 150,00
            description: 'Pedido #12345',
            externalId: 'order_12345',
            customer: {
                name: 'João da Silva',
                email: 'joao@email.com',
                document: '12345678900'
            }
        });
        
        console.log('QR Code:', charge.pixQrcode);
        console.log('Código PIX:', charge.pixKey);
        
        return charge;
    } catch (error) {
        console.error('Erro:', error.message);
    }
}

// Webhook handler (Express)
app.post('/webhook', safesplit.webhooks.verify('seu_webhook_secret'), (req, res) => {
    const event = req.body;
    
    switch (event.event) {
        case 'charge.paid':
            console.log('Pagamento recebido:', event.data.uuid);
            break;
    }
    
    res.json({ received: true });
});

Postman Collection

Importe nossa coleção do Postman para testar a API rapidamente:

Baixar Postman Collection

Pronto para começar?

Crie sua conta e comece a integrar pagamentos PIX em minutos.

Criar Conta Grátis