SysVelox SysVelox API

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.

NFC-e NFS-e

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

⇩ Baixar exemplo.sh

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

⇩ Baixar exemplo.php

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

⇩ Baixar exemplo.js

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

⇩ Baixar exemplo.py

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

⇩ Baixar Exemplo.java

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

⇩ Baixar exemplo-nfse.sh

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

⇩ Baixar exemplo-nfse.php

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

⇩ Baixar exemplo-nfse.js

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

⇩ Baixar exemplo-nfse.py

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

⇩ Baixar ExemploNfse.java

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.