API pública da Conta Nexiuz
Guia de integração servidor a servidor: autenticação, escopos, assinatura, idempotência e endpoints.
A API pública da Conta Nexiuz é a interface oficial servidor a servidor em /api/public/v1 para parceiros e sistemas integradores.
O acesso à API requer credenciais ativas e contas vinculadas à sua aplicação. Caso o serviço não esteja ativado para seu ambiente ou suas credenciais não tenham os escopos necessários, as requisições respondem 503 SERVICE_UNAVAILABLE ou 403 INSUFFICIENT_SCOPE. Confirme as credenciais e o host designado com a equipe de onboarding da Noviuz.
Fluxo recomendado
- No Portal, crie uma aplicação e vincule somente as contas e escopos necessários. Gere credenciais
TESTpara desenvolvimento. - Armazene
client_secretesigning_secretem um cofre de segredos no backend. Nunca os envie a navegador ou aplicativo móvel. - Troque
client_ideclient_secretpor um token comPOST /api/public/v1/access-tokensusando HTTP Basic. - Envie o token como
Authorization: Bearer …. Para escritas, assine o método, caminho e bytes exatos do corpo com HMAC-SHA256. - Em toda mutação financeira, reutilize o mesmo
codeao repetir a mesma intenção após timeout; use umcodenovo para uma intenção nova.
Autenticação e token
curl -X POST "$BASE_URL/api/public/v1/access-tokens" \
-u "$NOVIUZ_CLIENT_ID:$NOVIUZ_CLIENT_SECRET"Resposta real (200):
{
"token": "nxt_test_…",
"expiresIn": 3600,
"type": "Bearer"
}O token dura uma hora. Renove-o antes de expirar. A aplicação, a credencial e o token precisam permanecer ativos; suspender a aplicação ou revogar a credencial bloqueia autenticações subsequentes. O token é retornado com Cache-Control: no-store.
Escopos
| Escopo | Uso |
|---|---|
accounts:read | Listar contas vinculadas e consultar seus dados e saldos. |
transactions:read | Consultar o extrato. |
pix:read / pix:write | Consultar cobranças / criar e simular cobranças. |
withdrawals:read / withdrawals:write | Consultar / solicitar e simular saques. |
webhooks:read / webhooks:write | Consultar endpoints e entregas / criar e administrar endpoints. |
O escopo do token limita a credencial. A aplicação também precisa ter a autorização exigida para a conta/operação; possuir withdrawals:write, por exemplo, não substitui a autorização de saque aplicável à Entity. Contas fora do vínculo da aplicação respondem 404 OBJECT_NOT_FOUND.
Assinatura das escritas
Todas as rotas POST, PATCH e DELETE da API pública que exigem assinatura usam X-Signature, X-Timestamp e X-Nonce, além do Bearer. Gere o hash sobre os bytes exatos enviados. Para corpo vazio, o hash no material é a string vazia.
body_hash = hex(SHA256(raw_body)) # vazio se não houver corpo
material = timestamp + "." + nonce + "." + METHOD + "." + path + "." + body_hash
signature = hex(HMAC_SHA256(signing_secret, material))O METHOD é maiúsculo; path inclui o prefixo /api/public/v1 e não inclui query string. O timestamp é Unix em segundos: por padrão o servidor aceita até 300 segundos de idade e até 60 segundos de adiantamento (o limite de idade pode ser configurado por ambiente). X-Nonce deve ter 16–128 caracteres ASCII entre letras, números, _ e -; cada nonce só pode ser usado uma vez. Assinatura, timestamp, nonce ou credencial inválidos retornam erro genérico 401.
Exemplo Node.js para serializar e assinar uma requisição JSON:
import { createHash, createHmac, randomBytes, randomUUID } from 'node:crypto';
const method = 'POST';
const path = '/api/public/v1/pix';
const body = JSON.stringify({
code: randomUUID(),
account_id: process.env.NOVIUZ_ACCOUNT_ID,
amount: '50.00',
payer_document: '52998224725',
});
const timestamp = Math.floor(Date.now() / 1000).toString();
const nonce = randomBytes(16).toString('hex');
const bodyHash = createHash('sha256').update(body).digest('hex');
const material = `${timestamp}.${nonce}.${method}.${path}.${bodyHash}`;
const signature = createHmac('sha256', process.env.NOVIUZ_SIGNING_SECRET!)
.update(material).digest('hex');
const response = await fetch(`${process.env.NOVIUZ_BASE_URL}${path}`, {
method,
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json',
'X-Timestamp': timestamp,
'X-Nonce': nonce,
'X-Signature': signature,
},
body,
});Não serialize o objeto novamente depois de calcular a assinatura: qualquer mudança nos bytes invalida o HMAC. Em produção, adicione timeout, tratamento do corpo de erro e renovação de token.
Idempotência financeira
PIX e saque identificam a intenção pelo campo code no corpo. Reenvie o mesmo corpo e code depois de timeout para obter o resultado da mesma operação. Se a chave já existir com dados diferentes, a API responde 409 IDEMPOTENCY_CONFLICT. Não gere um code novo automaticamente ao repetir uma chamada cujo resultado é desconhecido: isso pode criar uma segunda operação.
Endpoints
Todas as respostas monetárias usam strings decimais. Valores devem ser positivos, finitos e ter no máximo duas casas decimais; o servidor não arredonda silenciosamente. Os cursores de paginação são opacos: envie after ou before, nunca ambos.
| Método e caminho | Escopo | Assinatura | Descrição |
|---|---|---|---|
POST /access-tokens | Basic Auth | Não | Emite token. |
GET /accounts | accounts:read | Não | Lista contas vinculadas. |
GET /accounts/{account_id} | accounts:read | Não | Consulta uma conta vinculada. |
GET /accounts/{account_id}/balance | accounts:read | Não | Consulta saldos disponível e retido. |
GET /accounts/{account_id}/transactions | transactions:read | Não | Extrato; limit entre 1 e 50, padrão 25. |
POST /pix | pix:write | Sim | Cria cobrança; exige code, account_id, amount e payer_document. |
GET /pix, GET /pix/{charge_id} | pix:read | Não | Lista ou consulta cobranças. |
POST /pix/{charge_id}/simulate-payment | pix:write | Sim | Simulação disponível somente para aplicação TEST. Corpo: {"outcome":"success"} ou {"outcome":"failure"}. |
POST /withdrawals | withdrawals:write | Sim | Solicita saque PIX; exige autorização aplicável além do escopo. |
GET /withdrawals, GET /withdrawals/{withdrawal_id} | withdrawals:read | Não | Lista ou consulta saques. |
POST /withdrawals/{withdrawal_id}/simulate-outcome | withdrawals:write | Sim | Simulação somente em TEST; outcome success ou failure. |
POST /webhook-endpoints | webhooks:write | Sim | Cria endpoint; o segredo aparece só nesta resposta. |
GET /webhook-endpoints e GET /webhook-endpoints/{endpoint_id} | webhooks:read | Não | Lista ou consulta endpoints. |
PATCH, DELETE /webhook-endpoints/{endpoint_id} | webhooks:write | Sim | Atualiza ou remove endpoint. |
POST /webhook-endpoints/{endpoint_id}/rotate-secret | webhooks:write | Sim | Rotaciona segredo; aparece só nesta resposta. |
GET /webhook-endpoints/{endpoint_id}/deliveries | webhooks:read | Não | Lista entregas. |
POST /webhook-endpoints/{endpoint_id}/deliveries/{delivery_id}/retry | webhooks:write | Sim | Reenvia entrega em estado FAILED. |
Criar cobrança PIX
POST /api/public/v1/pix
Authorization: Bearer <token>
Content-Type: application/json
X-Timestamp: <unix-seconds>
X-Nonce: <unique-random-value>
X-Signature: <hex-hmac>
{
"code": "order-4821-payment-1",
"account_id": "<id-da-conta-vinculada>",
"amount": "100.50",
"payer_document": "52998224725",
"payer_name": "Cliente",
"metadata": {"order_id": "4821"}
}metadata aceita até 50 pares; nomes de chave que indiquem PII (documento, e-mail, telefone, nome etc.) são recusados. Documentos são mascarados nas respostas. Uma criação nova retorna 201; replay idêntico retorna 200 com o recurso existente.
Solicitar saque
{
"code": "payout-4821-1",
"account_id": "<id-da-conta-vinculada>",
"amount": "25.00",
"destination": {
"rail": "PIX",
"pix_key": "financeiro@example.com",
"pix_key_type": "EMAIL",
"beneficiary_document": "52998224725",
"beneficiary_name": "Beneficiário"
}
}O destino e os documentos são mascarados na resposta. Saques podem exigir um grant/autorização ativa no escopo patrimonial da conta; um token com o escopo correto, sozinho, não garante que a solicitação será autorizada.
Erros
Corpo de erro da API: {"code":"…","message":"…","errors":[]}. Use code para lógica de máquina; message é texto informativo.
| HTTP | Exemplos de code | Ação |
|---|---|---|
400 | INVALID_BODY, INVALID_PAYER_DOCUMENT | Corrija os campos indicados em errors. |
401 | INVALID_CREDENTIALS, TOKEN_EXPIRED | Confira credenciais, token, relógio, assinatura e nonce. Falhas de HMAC são genéricas. |
403 | INSUFFICIENT_SCOPE, IP_NOT_ALLOWED | Peça o escopo ou ajuste permitido de rede; autorização de saque também pode ser necessária. |
404 | OBJECT_NOT_FOUND | Confira o ID e o vínculo à aplicação. Recursos fora do vínculo também são ocultados como 404. |
409 | IDEMPOTENCY_CONFLICT, DEPOSIT_IN_PROGRESS e conflitos de estado | Preserve o mesmo code para retry da mesma intenção; consulte o recurso antes de iniciar outra. |
422 | Regras de negócio/validação | Corrija o valor ou estado conforme o detalhe da resposta. |
429 | RATE_LIMIT_EXCEEDED | Respeite Retry-After e aplique backoff. |
503 | SERVICE_UNAVAILABLE | API desabilitada ou indisponível; tente mais tarde e confirme o estado do ambiente. |
Webhooks
Eventos, formato de assinatura, deduplicação e política de retentativa estão no guia de Webhooks. O catálogo é limitado aos eventos habilitados para sua aplicação.