Exemplos de código
Um exemplo completo por linguagem, para cada tipo de documento fiscal. Copie, troque a chave e o ID da empresa, e rode.
Emite uma NFC-e e consulta o status. Testado de verdade contra a API antes de publicar aqui.
cURL
Linha de comando — qualquer sistema operacional
Como rodar: bash exemplo.sh
#!/bin/bash
# Exemplo de integração com a API Fiscal SysVelox — cURL (funciona em qualquer terminal
# Linux/macOS com curl instalado; no Windows, use o Git Bash ou WSL).
#
# 1. Troque API_KEY pela sua chave (gerada em https://api.sysvelox.com/conta/chaves.php)
# 2. Troque COMPANY_ID pelo ID da sua empresa (veja em https://api.sysvelox.com/conta/empresas.php)
# 3. Rode: bash exemplo.sh
set -e
API_KEY="sk_test_TROQUE_PELA_SUA_CHAVE"
COMPANY_ID="TROQUE_PELO_ID_DA_EMPRESA"
BASE_URL="https://api.sysvelox.com"
# payment_method (opcional, padrão "dinheiro"): dinheiro, cheque, cartao_credito,
# cartao_debito, credito_loja, vale_alimentacao, vale_refeicao, vale_presente,
# vale_combustivel, boleto, deposito_bancario, pix, transferencia, sem_pagamento, outros.
# destinatario (opcional): CPF/CNPJ do cliente na nota — omita pra consumidor não identificado.
#
# OPÇÕES AVANÇADAS (JSON não aceita comentário dentro do -d, então ficam aqui em texto —
# só acrescentar a chave dentro do corpo abaixo quando precisar). Referência completa em
# https://api.sysvelox.com/docs/referencia.php:
# "discount_cents": 500 desconto total da venda, em centavos
# "freight_cents": 300 frete, em centavos
# "change_cents": 500 troco (só com payment_method = dinheiro)
# "payments": [ pagamento dividido — substitui payment_method
# {"method": "dinheiro", "amount_cents": 500},
# {"method": "cartao_credito", "amount_cents": 500}
# ]
echo "== Emitindo NFC-e =="
RESPOSTA=$(curl -sS -X POST "$BASE_URL/v1/nfce" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: exemplo-$(date +%s)" \
-d '{
"company_id": "'"$COMPANY_ID"'",
"payment_method": "pix",
"destinatario": {
"documento": "11122233396",
"nome": "Cliente Exemplo"
},
"items": [
{
"description": "Produto de exemplo",
"ncm": "12345678",
"cfop": "5102",
"unit": "UN",
"quantity": 1,
"unit_price_cents": 1000,
"total_cents": 1000,
"csosn": "102",
"cst_pis": "07",
"cst_cofins": "07"
}
]
}')
echo "$RESPOSTA"
# Extrai o id do documento da resposta (sem dependência de jq — só grep/sed)
DOC_ID=$(echo "$RESPOSTA" | grep -o '"id":"[^"]*"' | head -1 | sed 's/"id":"//;s/"//')
if [ -z "$DOC_ID" ]; then
echo "Não consegui extrair o id do documento — confira o erro acima."
exit 1
fi
echo ""
echo "== Consultando status de $DOC_ID (aguardando alguns segundos) =="
sleep 5
curl -sS "$BASE_URL/v1/notas/$DOC_ID" \
-H "Authorization: Bearer $API_KEY"
echo ""
PHP
Só cURL nativo do PHP, sem Composer nem dependências
Como rodar: php exemplo.php
<?php
/**
* Exemplo de integração com a API Fiscal SysVelox — PHP puro (sem dependências, só cURL
* nativo do PHP).
*
* 1. Troque API_KEY pela sua chave (gerada em https://api.sysvelox.com/conta/chaves.php)
* 2. Troque COMPANY_ID pelo ID da sua empresa (veja em https://api.sysvelox.com/conta/empresas.php)
* 3. Rode: php exemplo.php
*/
declare(strict_types=1);
const API_KEY = 'sk_test_TROQUE_PELA_SUA_CHAVE';
const COMPANY_ID = 'TROQUE_PELO_ID_DA_EMPRESA';
const BASE_URL = 'https://api.sysvelox.com';
/** @param array<string,mixed> $body */
function chamarApi(string $method, string $path, ?array $body = null, ?string $idempotencyKey = null): array
{
$headers = ['Authorization: Bearer ' . API_KEY, 'Content-Type: application/json'];
if ($idempotencyKey !== null) {
$headers[] = 'Idempotency-Key: ' . $idempotencyKey;
}
$ch = curl_init(BASE_URL . $path);
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => $body !== null ? json_encode($body) : null,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return ['status' => $status, 'body' => json_decode($response, true)];
}
echo "== Emitindo NFC-e ==\n";
$emissao = chamarApi('POST', '/v1/nfce', [
'company_id' => COMPANY_ID,
// Opcional: forma de pagamento (padrão "dinheiro" se omitido). Valores aceitos:
// dinheiro, cheque, cartao_credito, cartao_debito, credito_loja, vale_alimentacao,
// vale_refeicao, vale_presente, vale_combustivel, boleto, deposito_bancario, pix,
// transferencia, sem_pagamento, outros.
'payment_method' => 'pix',
// Opcional: CPF/CNPJ do cliente na nota (só números). Omita pra consumidor não
// identificado.
'destinatario' => [
'documento' => '11122233396',
'nome' => 'Cliente Exemplo',
],
// ------------------------------------------------------------------
// OPÇÕES AVANÇADAS (descomente o que precisar) — todo campo explicado
// em https://api.sysvelox.com/docs/referencia.php
// ------------------------------------------------------------------
// 'discount_cents' => 500, // desconto total da venda, em centavos
// 'freight_cents' => 300, // frete, em centavos
// 'change_cents' => 500, // troco (só com payment_method = dinheiro)
// 'payments' => [ // pagamento dividido — substitui payment_method
// ['method' => 'dinheiro', 'amount_cents' => 500],
// ['method' => 'cartao_credito', 'amount_cents' => 500],
// ],
'items' => [
[
'description' => 'Produto de exemplo',
'ncm' => '12345678',
'cfop' => '5102',
'unit' => 'UN',
'quantity' => 1,
'unit_price_cents' => 1000,
'total_cents' => 1000,
'csosn' => '102',
'cst_pis' => '07',
'cst_cofins' => '07',
],
],
], 'exemplo-' . time());
echo "HTTP {$emissao['status']}\n";
print_r($emissao['body']);
if ($emissao['status'] >= 400) {
exit(1);
}
$documentoId = $emissao['body']['id'];
echo "\n== Consultando status de {$documentoId} (aguardando alguns segundos) ==\n";
sleep(5);
$consulta = chamarApi('GET', "/v1/notas/{$documentoId}");
echo "HTTP {$consulta['status']}\n";
print_r($consulta['body']);
Node.js
fetch nativo (Node 18+), sem npm install
Como rodar: node exemplo.js
/**
* Exemplo de integração com a API Fiscal SysVelox — Node.js (usa fetch nativo, sem
* dependências — precisa do Node 18 ou mais novo).
*
* 1. Troque API_KEY pela sua chave (gerada em https://api.sysvelox.com/conta/chaves.php)
* 2. Troque COMPANY_ID pelo ID da sua empresa (veja em https://api.sysvelox.com/conta/empresas.php)
* 3. Rode: node exemplo.js
*/
const API_KEY = 'sk_test_TROQUE_PELA_SUA_CHAVE';
const COMPANY_ID = 'TROQUE_PELO_ID_DA_EMPRESA';
const BASE_URL = 'https://api.sysvelox.com';
async function chamarApi(method, path, body, idempotencyKey) {
const headers = {
Authorization: `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
};
if (idempotencyKey) {
headers['Idempotency-Key'] = idempotencyKey;
}
const response = await fetch(BASE_URL + path, {
method,
headers,
body: body ? JSON.stringify(body) : undefined,
});
return { status: response.status, body: await response.json() };
}
function dormir(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function main() {
console.log('== Emitindo NFC-e ==');
const emissao = await chamarApi(
'POST',
'/v1/nfce',
{
company_id: COMPANY_ID,
// Opcional: forma de pagamento (padrão "dinheiro" se omitido). Valores aceitos:
// dinheiro, cheque, cartao_credito, cartao_debito, credito_loja, vale_alimentacao,
// vale_refeicao, vale_presente, vale_combustivel, boleto, deposito_bancario, pix,
// transferencia, sem_pagamento, outros.
payment_method: 'pix',
// Opcional: CPF/CNPJ do cliente na nota (só números). Omita pra consumidor não
// identificado.
destinatario: {
documento: '11122233396',
nome: 'Cliente Exemplo',
},
// ------------------------------------------------------------------
// OPÇÕES AVANÇADAS (descomente o que precisar) — todo campo explicado
// em https://api.sysvelox.com/docs/referencia.php
// ------------------------------------------------------------------
// discount_cents: 500, // desconto total da venda, em centavos
// freight_cents: 300, // frete, em centavos
// change_cents: 500, // troco (só com payment_method = dinheiro)
// payments: [ // pagamento dividido — substitui payment_method
// { method: 'dinheiro', amount_cents: 500 },
// { method: 'cartao_credito', amount_cents: 500 },
// ],
items: [
{
description: 'Produto de exemplo',
ncm: '12345678',
cfop: '5102',
unit: 'UN',
quantity: 1,
unit_price_cents: 1000,
total_cents: 1000,
csosn: '102',
cst_pis: '07',
cst_cofins: '07',
},
],
},
'exemplo-' + Date.now(),
);
console.log(`HTTP ${emissao.status}`);
console.log(emissao.body);
if (emissao.status >= 400) {
process.exit(1);
}
const documentoId = emissao.body.id;
console.log(`\n== Consultando status de ${documentoId} (aguardando alguns segundos) ==`);
await dormir(5000);
const consulta = await chamarApi('GET', `/v1/notas/${documentoId}`);
console.log(`HTTP ${consulta.status}`);
console.log(consulta.body);
}
main().catch((err) => {
console.error(err);
process.exit(1);
});
Python
Só biblioteca padrão (urllib), sem pip install
Como rodar: python3 exemplo.py
"""
Exemplo de integração com a API Fiscal SysVelox — Python (só biblioteca padrão, sem
precisar instalar nada com pip).
1. Troque API_KEY pela sua chave (gerada em https://api.sysvelox.com/conta/chaves.php)
2. Troque COMPANY_ID pelo ID da sua empresa (veja em https://api.sysvelox.com/conta/empresas.php)
3. Rode: python3 exemplo.py
"""
import json
import time
import urllib.request
import urllib.error
API_KEY = "sk_test_TROQUE_PELA_SUA_CHAVE"
COMPANY_ID = "TROQUE_PELO_ID_DA_EMPRESA"
BASE_URL = "https://api.sysvelox.com"
def chamar_api(method, path, body=None, idempotency_key=None):
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}
if idempotency_key:
headers["Idempotency-Key"] = idempotency_key
data = json.dumps(body).encode("utf-8") if body is not None else None
request = urllib.request.Request(BASE_URL + path, data=data, headers=headers, method=method)
try:
with urllib.request.urlopen(request) as response:
return response.status, json.loads(response.read())
except urllib.error.HTTPError as error:
return error.code, json.loads(error.read())
def main():
print("== Emitindo NFC-e ==")
status, emissao = chamar_api(
"POST",
"/v1/nfce",
{
"company_id": COMPANY_ID,
# Opcional: forma de pagamento (padrão "dinheiro" se omitido). Valores aceitos:
# dinheiro, cheque, cartao_credito, cartao_debito, credito_loja,
# vale_alimentacao, vale_refeicao, vale_presente, vale_combustivel, boleto,
# deposito_bancario, pix, transferencia, sem_pagamento, outros.
"payment_method": "pix",
# Opcional: CPF/CNPJ do cliente na nota (só números). Omita pra consumidor não
# identificado.
"destinatario": {
"documento": "11122233396",
"nome": "Cliente Exemplo",
},
# ------------------------------------------------------------------
# OPÇÕES AVANÇADAS (descomente o que precisar) — todo campo explicado
# em https://api.sysvelox.com/docs/referencia.php
# ------------------------------------------------------------------
# "discount_cents": 500, # desconto total da venda, em centavos
# "freight_cents": 300, # frete, em centavos
# "change_cents": 500, # troco (só com payment_method = dinheiro)
# "payments": [ # pagamento dividido — substitui payment_method
# {"method": "dinheiro", "amount_cents": 500},
# {"method": "cartao_credito", "amount_cents": 500},
# ],
"items": [
{
"description": "Produto de exemplo",
"ncm": "12345678",
"cfop": "5102",
"unit": "UN",
"quantity": 1,
"unit_price_cents": 1000,
"total_cents": 1000,
"csosn": "102",
"cst_pis": "07",
"cst_cofins": "07",
}
],
},
idempotency_key=f"exemplo-{int(time.time())}",
)
print(f"HTTP {status}")
print(emissao)
if status >= 400:
return
documento_id = emissao["id"]
print(f"\n== Consultando status de {documento_id} (aguardando alguns segundos) ==")
time.sleep(5)
status, consulta = chamar_api("GET", f"/v1/notas/{documento_id}")
print(f"HTTP {status}")
print(consulta)
if __name__ == "__main__":
main()
Java
java.net.http.HttpClient (JDK 11+), sem Maven/Gradle
Como rodar: java Exemplo.java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Exemplo de integração com a API Fiscal SysVelox — Java (usa só java.net.http.HttpClient,
* embutido no JDK 11+, sem dependências externas).
*
* 1. Troque API_KEY pela sua chave (gerada em https://api.sysvelox.com/conta/chaves.php)
* 2. Troque COMPANY_ID pelo ID da sua empresa (veja em https://api.sysvelox.com/conta/empresas.php)
* 3. Rode: java Exemplo.java (Java 11+ roda direto, sem precisar compilar antes)
*
* Este exemplo extrai o campo "id" da resposta com uma expressão regular simples, só pra
* não depender de uma biblioteca de JSON — num projeto de verdade, use uma (Jackson, Gson).
*/
public class Exemplo {
static final String API_KEY = "sk_test_TROQUE_PELA_SUA_CHAVE";
static final String COMPANY_ID = "TROQUE_PELO_ID_DA_EMPRESA";
static final String BASE_URL = "https://api.sysvelox.com";
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10)).build();
System.out.println("== Emitindo NFC-e ==");
// payment_method (opcional, padrão "dinheiro") e destinatario (opcional, CPF/CNPJ
// do cliente na nota) — omita "destinatario" pra consumidor não identificado.
//
// OPÇÕES AVANÇADAS (text block Java não aceita comentário dentro do JSON, então
// ficam aqui em texto — só acrescentar a chave dentro do payload abaixo quando
// precisar). Referência completa em https://api.sysvelox.com/docs/referencia.php:
// "discount_cents": 500 desconto total da venda, em centavos
// "freight_cents": 300 frete, em centavos
// "change_cents": 500 troco (só com payment_method = dinheiro)
// "payments": [ pagamento dividido — substitui payment_method
// {"method": "dinheiro", "amount_cents": 500},
// {"method": "cartao_credito", "amount_cents": 500}
// ]
String payload = """
{
"company_id": "%s",
"payment_method": "pix",
"destinatario": {
"documento": "11122233396",
"nome": "Cliente Exemplo"
},
"items": [
{
"description": "Produto de exemplo",
"ncm": "12345678",
"cfop": "5102",
"unit": "UN",
"quantity": 1,
"unit_price_cents": 1000,
"total_cents": 1000,
"csosn": "102",
"cst_pis": "07",
"cst_cofins": "07"
}
]
}
""".formatted(COMPANY_ID);
HttpRequest emitirRequest = HttpRequest.newBuilder()
.uri(URI.create(BASE_URL + "/v1/nfce"))
.header("Authorization", "Bearer " + API_KEY)
.header("Content-Type", "application/json")
.header("Idempotency-Key", "exemplo-" + System.currentTimeMillis())
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
HttpResponse<String> emissao = client.send(emitirRequest, HttpResponse.BodyHandlers.ofString());
System.out.println("HTTP " + emissao.statusCode());
System.out.println(emissao.body());
if (emissao.statusCode() >= 400) {
return;
}
String documentoId = extrairCampo(emissao.body(), "id");
System.out.println("\n== Consultando status de " + documentoId + " (aguardando alguns segundos) ==");
Thread.sleep(5000);
HttpRequest consultaRequest = HttpRequest.newBuilder()
.uri(URI.create(BASE_URL + "/v1/notas/" + documentoId))
.header("Authorization", "Bearer " + API_KEY)
.GET()
.build();
HttpResponse<String> consulta = client.send(consultaRequest, HttpResponse.BodyHandlers.ofString());
System.out.println("HTTP " + consulta.statusCode());
System.out.println(consulta.body());
}
static String extrairCampo(String json, String campo) {
Matcher matcher = Pattern.compile("\"" + campo + "\"\\s*:\\s*\"([^\"]*)\"").matcher(json);
return matcher.find() ? matcher.group(1) : null;
}
}
Emite uma NFS-e (Sistema Nacional NFS-e) e consulta o status. Testado de verdade contra a API antes de publicar aqui.
cURL
Linha de comando — qualquer sistema operacional
Como rodar: bash exemplo-nfse.sh
#!/bin/bash
# Exemplo de integração com a API Fiscal SysVelox — NFS-e via cURL (funciona em qualquer
# terminal Linux/macOS com curl instalado; no Windows, use o Git Bash ou WSL).
#
# 1. Troque API_KEY pela sua chave (gerada em https://api.sysvelox.com/conta/chaves.php)
# 2. Troque COMPANY_ID pelo ID da sua empresa (veja em https://api.sysvelox.com/conta/empresas.php)
# 3. Rode: bash exemplo-nfse.sh
set -e
API_KEY="sk_test_TROQUE_PELA_SUA_CHAVE"
COMPANY_ID="TROQUE_PELO_ID_DA_EMPRESA"
BASE_URL="https://api.sysvelox.com"
# competencia (opcional, AAAA-MM-DD): período em que o serviço foi de fato prestado — se
# omitido, assume hoje. c_ind_op/cst_ibs_cbs/cclass_trib (opcionais, Reforma Tributária):
# só monta o grupo IBS/CBS quando os três vêm juntos.
echo "== Emitindo NFS-e =="
RESPOSTA=$(curl -sS -X POST "$BASE_URL/v1/nfse" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: exemplo-nfse-$(date +%s)" \
-d '{
"company_id": "'"$COMPANY_ID"'",
"tomador": {
"documento": "11122233396",
"nome": "Cliente Exemplo",
"email": null,
"endereco": {
"cep": "65775000",
"logradouro": "Rua Exemplo",
"numero": "100",
"complemento": null,
"bairro": "Centro",
"codigo_municipio": "2104404"
}
},
"servico": {
"codigo_tributacao_nacional": "140201",
"codigo_tributacao_municipal": null,
"codigo_nbs": null,
"descricao": "Serviço de exemplo",
"valor_cents": 10000,
"iss_retido": false,
"aliquota_iss": 2.01,
"c_ind_op": null,
"cst_ibs_cbs": null,
"cclass_trib": null,
"ind_final": false
},
"competencia": "'"$(date +%Y-%m-%d)"'"
}')
echo "$RESPOSTA"
# Extrai o id do documento da resposta (sem dependência de jq — só grep/sed)
DOC_ID=$(echo "$RESPOSTA" | grep -o '"id":"[^"]*"' | head -1 | sed 's/"id":"//;s/"//')
if [ -z "$DOC_ID" ]; then
echo "Não consegui extrair o id do documento — confira o erro acima."
exit 1
fi
echo ""
echo "== Consultando status de $DOC_ID (aguardando alguns segundos) =="
sleep 5
curl -sS "$BASE_URL/v1/notas/$DOC_ID" \
-H "Authorization: Bearer $API_KEY"
echo ""
PHP
Só cURL nativo do PHP, sem Composer nem dependências
Como rodar: php exemplo-nfse.php
<?php
/**
* Exemplo de integração com a API Fiscal SysVelox — NFS-e, PHP puro (sem dependências, só
* cURL nativo do PHP).
*
* 1. Troque API_KEY pela sua chave (gerada em https://api.sysvelox.com/conta/chaves.php)
* 2. Troque COMPANY_ID pelo ID da sua empresa (veja em https://api.sysvelox.com/conta/empresas.php)
* 3. Rode: php exemplo-nfse.php
*/
declare(strict_types=1);
const API_KEY = 'sk_test_TROQUE_PELA_SUA_CHAVE';
const COMPANY_ID = 'TROQUE_PELO_ID_DA_EMPRESA';
const BASE_URL = 'https://api.sysvelox.com';
/** @param array<string,mixed> $body */
function chamarApi(string $method, string $path, ?array $body = null, ?string $idempotencyKey = null): array
{
$headers = ['Authorization: Bearer ' . API_KEY, 'Content-Type: application/json'];
if ($idempotencyKey !== null) {
$headers[] = 'Idempotency-Key: ' . $idempotencyKey;
}
$ch = curl_init(BASE_URL . $path);
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => $body !== null ? json_encode($body) : null,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return ['status' => $status, 'body' => json_decode($response, true)];
}
echo "== Emitindo NFS-e ==\n";
$emissao = chamarApi('POST', '/v1/nfse', [
'company_id' => COMPANY_ID,
'tomador' => [
'documento' => '11122233396',
'nome' => 'Cliente Exemplo',
'email' => null,
'endereco' => [
'cep' => '65775000',
'logradouro' => 'Rua Exemplo',
'numero' => '100',
'complemento' => null,
'bairro' => 'Centro',
'codigo_municipio' => '2104404',
],
],
'servico' => [
'codigo_tributacao_nacional' => '140201',
'codigo_tributacao_municipal' => null,
// NBS (opcional, 9 dígitos) e o grupo IBS/CBS (Reforma Tributária, opcional) só
// entram no XML quando c_ind_op + cst_ibs_cbs + cclass_trib vêm juntos.
'codigo_nbs' => null,
'descricao' => 'Serviço de exemplo',
'valor_cents' => 10000,
'iss_retido' => false,
'aliquota_iss' => 2.01,
'c_ind_op' => null,
'cst_ibs_cbs' => null,
'cclass_trib' => null,
'ind_final' => false,
],
// competencia (opcional, AAAA-MM-DD): período em que o serviço foi de fato prestado —
// se omitido, assume hoje. Não confunda com a data de emissão.
'competencia' => date('Y-m-d'),
], 'exemplo-nfse-' . time());
echo "HTTP {$emissao['status']}\n";
print_r($emissao['body']);
if ($emissao['status'] >= 400) {
exit(1);
}
$documentoId = $emissao['body']['id'];
echo "\n== Consultando status de {$documentoId} (aguardando alguns segundos) ==\n";
sleep(5);
$consulta = chamarApi('GET', "/v1/notas/{$documentoId}");
echo "HTTP {$consulta['status']}\n";
print_r($consulta['body']);
Node.js
fetch nativo (Node 18+), sem npm install
Como rodar: node exemplo-nfse.js
/**
* Exemplo de integração com a API Fiscal SysVelox — NFS-e, Node.js (fetch nativo, Node 18+,
* sem npm install).
*
* 1. Troque API_KEY pela sua chave (gerada em https://api.sysvelox.com/conta/chaves.php)
* 2. Troque COMPANY_ID pelo ID da sua empresa (veja em https://api.sysvelox.com/conta/empresas.php)
* 3. Rode: node exemplo-nfse.js
*/
const API_KEY = 'sk_test_TROQUE_PELA_SUA_CHAVE';
const COMPANY_ID = 'TROQUE_PELO_ID_DA_EMPRESA';
const BASE_URL = 'https://api.sysvelox.com';
async function chamarApi(method, path, body, idempotencyKey) {
const headers = { Authorization: 'Bearer ' + API_KEY, 'Content-Type': 'application/json' };
if (idempotencyKey) {
headers['Idempotency-Key'] = idempotencyKey;
}
const resposta = await fetch(BASE_URL + path, {
method,
headers,
body: body ? JSON.stringify(body) : undefined,
});
return { status: resposta.status, body: await resposta.json() };
}
function dormir(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function main() {
console.log('== Emitindo NFS-e ==');
const emissao = await chamarApi(
'POST',
'/v1/nfse',
{
company_id: COMPANY_ID,
tomador: {
documento: '11122233396',
nome: 'Cliente Exemplo',
email: null,
endereco: {
cep: '65775000',
logradouro: 'Rua Exemplo',
numero: '100',
complemento: null,
bairro: 'Centro',
codigo_municipio: '2104404',
},
},
servico: {
codigo_tributacao_nacional: '140201',
codigo_tributacao_municipal: null,
// NBS (opcional, 9 dígitos) e o grupo IBS/CBS (Reforma Tributária, opcional) só
// entram no XML quando c_ind_op + cst_ibs_cbs + cclass_trib vêm juntos.
codigo_nbs: null,
descricao: 'Serviço de exemplo',
valor_cents: 10000,
iss_retido: false,
aliquota_iss: 2.01,
c_ind_op: null,
cst_ibs_cbs: null,
cclass_trib: null,
ind_final: false,
},
// competencia (opcional, AAAA-MM-DD): período em que o serviço foi de fato
// prestado — se omitido, assume hoje. Não confunda com a data de emissão.
competencia: new Date().toISOString().slice(0, 10),
},
'exemplo-nfse-' + Date.now(),
);
console.log('HTTP', emissao.status);
console.log(emissao.body);
if (emissao.status >= 400) {
process.exit(1);
}
const documentoId = emissao.body.id;
console.log(`\n== Consultando status de ${documentoId} (aguardando alguns segundos) ==`);
await dormir(5000);
const consulta = await chamarApi('GET', `/v1/notas/${documentoId}`);
console.log('HTTP', consulta.status);
console.log(consulta.body);
}
main().catch((erro) => {
console.error(erro);
process.exit(1);
});
Python
Só biblioteca padrão (urllib), sem pip install
Como rodar: python3 exemplo-nfse.py
"""
Exemplo de integração com a API Fiscal SysVelox — NFS-e, Python (só biblioteca padrão,
sem precisar instalar nada com pip).
1. Troque API_KEY pela sua chave (gerada em https://api.sysvelox.com/conta/chaves.php)
2. Troque COMPANY_ID pelo ID da sua empresa (veja em https://api.sysvelox.com/conta/empresas.php)
3. Rode: python3 exemplo-nfse.py
"""
import json
import time
import datetime
import urllib.request
import urllib.error
API_KEY = "sk_test_TROQUE_PELA_SUA_CHAVE"
COMPANY_ID = "TROQUE_PELO_ID_DA_EMPRESA"
BASE_URL = "https://api.sysvelox.com"
def chamar_api(method, path, body=None, idempotency_key=None):
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}
if idempotency_key:
headers["Idempotency-Key"] = idempotency_key
data = json.dumps(body).encode("utf-8") if body is not None else None
request = urllib.request.Request(BASE_URL + path, data=data, headers=headers, method=method)
try:
with urllib.request.urlopen(request) as response:
return response.status, json.loads(response.read())
except urllib.error.HTTPError as error:
return error.code, json.loads(error.read())
def main():
print("== Emitindo NFS-e ==")
status, emissao = chamar_api(
"POST",
"/v1/nfse",
{
"company_id": COMPANY_ID,
"tomador": {
"documento": "11122233396",
"nome": "Cliente Exemplo",
"email": None,
"endereco": {
"cep": "65775000",
"logradouro": "Rua Exemplo",
"numero": "100",
"complemento": None,
"bairro": "Centro",
"codigo_municipio": "2104404",
},
},
"servico": {
"codigo_tributacao_nacional": "140201",
"codigo_tributacao_municipal": None,
# NBS (opcional, 9 dígitos) e o grupo IBS/CBS (Reforma Tributária, opcional)
# só entram no XML quando c_ind_op + cst_ibs_cbs + cclass_trib vêm juntos.
"codigo_nbs": None,
"descricao": "Serviço de exemplo",
"valor_cents": 10000,
"iss_retido": False,
"aliquota_iss": 2.01,
"c_ind_op": None,
"cst_ibs_cbs": None,
"cclass_trib": None,
"ind_final": False,
},
# competencia (opcional, AAAA-MM-DD): período em que o serviço foi de fato
# prestado — se omitido, assume hoje. Não confunda com a data de emissão.
"competencia": datetime.date.today().isoformat(),
},
idempotency_key=f"exemplo-nfse-{int(time.time())}",
)
print(f"HTTP {status}")
print(emissao)
if status >= 400:
return
documento_id = emissao["id"]
print(f"\n== Consultando status de {documento_id} (aguardando alguns segundos) ==")
time.sleep(5)
status, consulta = chamar_api("GET", f"/v1/notas/{documento_id}")
print(f"HTTP {status}")
print(consulta)
if __name__ == "__main__":
main()
Java
java.net.http.HttpClient (JDK 11+), sem Maven/Gradle
Como rodar: java ExemploNfse.java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.time.LocalDate;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Exemplo de integração com a API Fiscal SysVelox — NFS-e, Java (usa só java.net.http.HttpClient,
* embutido no JDK 11+, sem dependências externas).
*
* 1. Troque API_KEY pela sua chave (gerada em https://api.sysvelox.com/conta/chaves.php)
* 2. Troque COMPANY_ID pelo ID da sua empresa (veja em https://api.sysvelox.com/conta/empresas.php)
* 3. Rode: java ExemploNfse.java (Java 11+ roda direto, sem precisar compilar antes)
*
* Este exemplo extrai o campo "id" da resposta com uma expressão regular simples, só pra
* não depender de uma biblioteca de JSON — num projeto de verdade, use uma (Jackson, Gson).
*/
public class ExemploNfse {
static final String API_KEY = "sk_test_TROQUE_PELA_SUA_CHAVE";
static final String COMPANY_ID = "TROQUE_PELO_ID_DA_EMPRESA";
static final String BASE_URL = "https://api.sysvelox.com";
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10)).build();
System.out.println("== Emitindo NFS-e ==");
// competencia (opcional, AAAA-MM-DD): período em que o serviço foi de fato prestado —
// se omitido, assume hoje. codigo_nbs e o grupo IBS/CBS (Reforma Tributária) são
// opcionais; o grupo só entra no XML quando c_ind_op + cst_ibs_cbs + cclass_trib vêm juntos.
String payload = """
{
"company_id": "%s",
"tomador": {
"documento": "11122233396",
"nome": "Cliente Exemplo",
"email": null,
"endereco": {
"cep": "65775000",
"logradouro": "Rua Exemplo",
"numero": "100",
"complemento": null,
"bairro": "Centro",
"codigo_municipio": "2104404"
}
},
"servico": {
"codigo_tributacao_nacional": "140201",
"codigo_tributacao_municipal": null,
"codigo_nbs": null,
"descricao": "Serviço de exemplo",
"valor_cents": 10000,
"iss_retido": false,
"aliquota_iss": 2.01,
"c_ind_op": null,
"cst_ibs_cbs": null,
"cclass_trib": null,
"ind_final": false
},
"competencia": "%s"
}
""".formatted(COMPANY_ID, LocalDate.now());
HttpRequest emitirRequest = HttpRequest.newBuilder()
.uri(URI.create(BASE_URL + "/v1/nfse"))
.header("Authorization", "Bearer " + API_KEY)
.header("Content-Type", "application/json")
.header("Idempotency-Key", "exemplo-nfse-" + System.currentTimeMillis())
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
HttpResponse<String> emissao = client.send(emitirRequest, HttpResponse.BodyHandlers.ofString());
System.out.println("HTTP " + emissao.statusCode());
System.out.println(emissao.body());
if (emissao.statusCode() >= 400) {
return;
}
String documentoId = extrairCampo(emissao.body(), "id");
System.out.println("\n== Consultando status de " + documentoId + " (aguardando alguns segundos) ==");
Thread.sleep(5000);
HttpRequest consultaRequest = HttpRequest.newBuilder()
.uri(URI.create(BASE_URL + "/v1/notas/" + documentoId))
.header("Authorization", "Bearer " + API_KEY)
.GET()
.build();
HttpResponse<String> consulta = client.send(consultaRequest, HttpResponse.BodyHandlers.ofString());
System.out.println("HTTP " + consulta.statusCode());
System.out.println(consulta.body());
}
static String extrairCampo(String json, String campo) {
Matcher matcher = Pattern.compile("\"" + campo + "\"\\s*:\\s*\"([^\"]*)\"").matcher(json);
return matcher.find() ? matcher.group(1) : null;
}
}
Verificando a assinatura do webhook
Se você cadastrou um webhook, cada entrega vem com X-ApiNotas-Signature: t=<timestamp>,v1=<hmac>.
Antes de confiar no corpo da requisição, recalcule o HMAC e compare:
# PHP
$timestamp = ...; // extraído do header, parte "t="
$assinaturaRecebida = ...; // extraído do header, parte "v1="
$corpoBruto = file_get_contents('php://input');
$assinaturaEsperada = hash_hmac('sha256', "{$timestamp}.{$corpoBruto}", $segredoDoWebhook);
if (!hash_equals($assinaturaEsperada, $assinaturaRecebida)) {
http_response_code(401);
exit;
}
if (abs(time() - (int) $timestamp) > 300) { // 5 minutos de tolerância
http_response_code(401);
exit;
}
// segue com o processamento do evento
# Node.js
const crypto = require('crypto');
const esperado = crypto.createHmac('sha256', segredoDoWebhook)
.update(`${timestamp}.${corpoBruto}`)
.digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(esperado), Buffer.from(assinaturaRecebida))) {
return res.status(401).end();
}
O segredo (whsec_...) aparece uma única vez, na hora que você cadastra o webhook em
Minha conta → Webhooks — guarde num lugar seguro, não dá pra ver de novo depois.
Ficou com dúvida?
Pergunte no fórum ou veja a documentação de referência completa.