Weesy Docs

Serviços

Simular uma nota (sem emitir)

POST https://apifiscal.weesy.com.br/v1/empresas/{cnpj}/servicos/{id}/previa

Abrir na referência interativa

Mostra como a nota vai ficar — impostos, valores e códigos — sem emitir nada. Use para conferir um serviço novo antes da primeira nota. O corpo é o mesmo de Emitir NFS-e; idIntegracao e ambiente são opcionais aqui.

Parâmetros

NomeOndeTipoDescrição
cnpj
obrigatório
caminhostring

CNPJ da empresa, só números.

id
obrigatório
caminhointeger

O id do serviço, devolvido no cadastro.

Exemplo de chamada

cURL

curl --request POST \
  --url "https://apifiscal.weesy.com.br/v1/empresas/21664333000195/servicos/<id>/previa" \
  --header "Authorization: Bearer $WEESY_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
  "valorServico": 100,
  "discriminacao": "Suporte técnico — outubro/2026",
  "tomador": {
    "tipoPessoa": "J",
    "cpfCnpj": "11222333000181",
    "nome": "EMPRESA EXEMPLO LTDA",
    "endereco": {
      "cep": "01001000",
      "logradouro": "Rua Exemplo",
      "numero": "100",
      "bairro": "Centro",
      "codigoIbge": "3550308"
    }
  }
}'

Node.js

const resposta = await fetch("https://apifiscal.weesy.com.br/v1/empresas/21664333000195/servicos/<id>/previa", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.WEESY_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "valorServico": 100,
    "discriminacao": "Suporte técnico — outubro/2026",
    "tomador": {
      "tipoPessoa": "J",
      "cpfCnpj": "11222333000181",
      "nome": "EMPRESA EXEMPLO LTDA",
      "endereco": {
        "cep": "01001000",
        "logradouro": "Rua Exemplo",
        "numero": "100",
        "bairro": "Centro",
        "codigoIbge": "3550308"
      }
    }
  }),
});
console.log(resposta.status, await resposta.text());

Python

import os

import requests

resposta = requests.post(
    "https://apifiscal.weesy.com.br/v1/empresas/21664333000195/servicos/<id>/previa",
    headers={"Authorization": f"Bearer {os.environ['WEESY_TOKEN']}"},
    json={
        "valorServico": 100,
        "discriminacao": "Suporte técnico — outubro/2026",
        "tomador": {
            "tipoPessoa": "J",
            "cpfCnpj": "11222333000181",
            "nome": "EMPRESA EXEMPLO LTDA",
            "endereco": {
                "cep": "01001000",
                "logradouro": "Rua Exemplo",
                "numero": "100",
                "bairro": "Centro",
                "codigoIbge": "3550308",
            },
        },
    },
    timeout=30,
)
print(resposta.status_code, resposta.text)

PHP

<?php

$corpo = <<<'JSON'
{
  "valorServico": 100,
  "discriminacao": "Suporte técnico — outubro/2026",
  "tomador": {
    "tipoPessoa": "J",
    "cpfCnpj": "11222333000181",
    "nome": "EMPRESA EXEMPLO LTDA",
    "endereco": {
      "cep": "01001000",
      "logradouro": "Rua Exemplo",
      "numero": "100",
      "bairro": "Centro",
      "codigoIbge": "3550308"
    }
  }
}
JSON;

$contexto = stream_context_create(["http" => [
    "method" => "POST",
    "header" => implode("\r\n", ["Authorization: Bearer " . getenv("WEESY_TOKEN"), "Content-Type: application/json"]),
    "content" => $corpo,
    "ignore_errors" => true, // lê o corpo também nas respostas de erro
]]);
$resposta = file_get_contents("https://apifiscal.weesy.com.br/v1/empresas/21664333000195/servicos/<id>/previa", false, $contexto);
echo $http_response_header[0], PHP_EOL, $resposta, PHP_EOL;

C#

using System.Net.Http.Headers;
using System.Text;

using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("WEESY_TOKEN"));

var corpo = """
    {
      "valorServico": 100,
      "discriminacao": "Suporte técnico — outubro/2026",
      "tomador": {
        "tipoPessoa": "J",
        "cpfCnpj": "11222333000181",
        "nome": "EMPRESA EXEMPLO LTDA",
        "endereco": {
          "cep": "01001000",
          "logradouro": "Rua Exemplo",
          "numero": "100",
          "bairro": "Centro",
          "codigoIbge": "3550308"
        }
      }
    }
    """;

using var resposta = await http.PostAsync(
    "https://apifiscal.weesy.com.br/v1/empresas/21664333000195/servicos/<id>/previa",
    new StringContent(corpo, Encoding.UTF8, "application/json"));
Console.WriteLine($"{(int)resposta.StatusCode} {await resposta.Content.ReadAsStringAsync()}");

Corpo da requisição

CampoTipoDescrição
cnpjEmitentestring

CNPJ da empresa responsável pela NFS-e. Precisa ser uma empresa da sua conta.

servicoobject

Um dos dois — id ou codigo.

servico.idinteger
servico.codigostring

Código do integrador no cadastro, quando ele usa a própria codificação de serviços (ex.: 010902220).

valorServico
obrigatório
number

Valor bruto do serviço prestado.

discriminacaostring

Padrão = discriminação do serviço. Limite do padrão do município (1000 em Barueri e Nacional, 2000 nos outros) — acima disso é recusada, não truncada.

competenciastring (date)

Padrão = data da emissão.

municipioPrestacaostring

Município em que o serviço foi prestado, quando informado.

tomador
obrigatório
object

Dados de identificação do tomador do serviço.

tomador.tipoPessoa
obrigatório
string

Indica o tipo de pessoa do tomador.

Valores: F, J.

tomador.cpfCnpj
obrigatório
string

CPF ou CNPJ do tomador, sem pontuação.

tomador.nome
obrigatório
string

Nome completo ou razão social do tomador.

tomador.inscricaoMunicipalstring

Inscrição municipal do tomador, quando aplicável.

tomador.emailstring (email)

E-mail do tomador.

tomador.telefonestring

Telefone de contato do tomador.

tomador.endereco
obrigatório
object

Endereço do tomador.

tomador.endereco.cep
obrigatório
string

CEP do endereço, sem pontuação.

tomador.endereco.logradouro
obrigatório
string

Tipo e nome do logradouro.

tomador.endereco.numero
obrigatório
string

Número do endereço. Sem número? Mande S/N.

tomador.endereco.complementostring

Complemento do endereço, quando aplicável.

tomador.endereco.bairro
obrigatório
string

Bairro do endereço.

tomador.endereco.codigoIbge
obrigatório
string

Código IBGE do município do endereço.

destinatarioobject

Quando diferente do tomador (indDest = 1).

destinatario.tipoPessoa
obrigatório
string

Indica o tipo de pessoa do tomador.

Valores: F, J.

destinatario.cpfCnpj
obrigatório
string

CPF ou CNPJ do tomador, sem pontuação.

destinatario.nome
obrigatório
string

Nome completo ou razão social do tomador.

destinatario.inscricaoMunicipalstring

Inscrição municipal do tomador, quando aplicável.

destinatario.emailstring (email)

E-mail do tomador.

destinatario.telefonestring

Telefone de contato do tomador.

destinatario.endereco
obrigatório
object

Endereço do tomador.

destinatario.endereco.cep
obrigatório
string

CEP do endereço, sem pontuação.

destinatario.endereco.logradouro
obrigatório
string

Tipo e nome do logradouro.

destinatario.endereco.numero
obrigatório
string

Número do endereço. Sem número? Mande S/N.

destinatario.endereco.complementostring

Complemento do endereço, quando aplicável.

destinatario.endereco.bairro
obrigatório
string

Bairro do endereço.

destinatario.endereco.codigoIbge
obrigatório
string

Código IBGE do município do endereço.

imovelobject

Imóvel da operação — obrigatório com cIndOp 02xxxx (operação com bem imóvel). Campos do grupo imovel do leiaute nacional.

imovel.cib
obrigatório
string

Código do Cadastro Imobiliário Brasileiro (cCIB).

imovel.inscricaoImobiliariastring ou null

Inscrição imobiliária fiscal no município (inscImobFisc), quando houver.

imovel.endereco
obrigatório
object

Endereço para enviar. Não precisa mandar cidade nem UF — tiramos do código IBGE.

imovel.endereco.cep
obrigatório
string

CEP do endereço, sem pontuação.

imovel.endereco.logradouro
obrigatório
string

Tipo e nome do logradouro.

imovel.endereco.numero
obrigatório
string

Número do endereço. Sem número? Mande S/N.

imovel.endereco.complementostring

Complemento do endereço, quando aplicável.

imovel.endereco.bairro
obrigatório
string

Bairro do endereço.

imovel.endereco.codigoIbge
obrigatório
string

Código IBGE do município do endereço.

issRetidoboolean

Padrão = o do serviço.

aliquotaSimplesnumber

Obrigatória para Simples com retenção.

consumoPessoalboolean

Padrão = o do serviço.

deducoesnumber

Valor das deduções aplicado à prestação.

descontoIncondicionadonumber

Desconto concedido sem condição.

descontoCondicionadonumber

Desconto vinculado a condição.

outrasRetencoesnumber

Valor de outras retenções informadas na prestação.

retencoesFederaisobject

Valores de retenções federais informados na emissão.

retencoesFederais.pisnumber

Valor da retenção de PIS.

retencoesFederais.cofinsnumber

Valor da retenção de COFINS.

retencoesFederais.csllnumber

Valor da retenção de CSLL.

retencoesFederais.irnumber

Valor da retenção de Imposto de Renda.

retencoesFederais.inssnumber

Valor da retenção de INSS.

enviarEmailboolean

Quando verdadeiro, solicita o envio da nota por e-mail após o processamento previsto. O valor padrão do contrato é true.

idIntegracaostring
ambientestring

Onde a nota vai ser emitida. O endereço da API é o mesmo para os três — quem decide é este campo, em cada nota.

ValorPara quêPrecisa de certificado?
simulacaoDesenvolver e testar. Nada sai da Weesy: nós respondemos no lugar da prefeituraNão
homologacaoTestar no ambiente de testes da própria prefeitura. Nem toda prefeitura tem — veja Verificar se a cidade é atendidaSim
producaoA nota de verdade, com valor fiscalSim

Como a simulação se comporta

  • A nota passa por recebida → em_processamento → autorizada em poucos segundos, e os webhooks são enviados como em produção.
  • O número e o código de verificação são fictícios. O PDF e o XML existem e vêm marcados "SEM VALOR FISCAL — SIMULAÇÃO".
  • Para testar uma rejeição, comece a discriminacao com SIMULAR_REJEICAO: a nota termina como rejeitada, com uma mensagem de exemplo.
  • O cancelamento também é simulado (cancelada).
  • Os dados são validados como em produção — o que passa aqui, passa lá.
  • Notas em simulação e homologação não contam no seu uso.
ValorSignificado
simulacaoTeste sem certificado — a Weesy responde no lugar da prefeitura
homologacaoTeste no ambiente de testes da prefeitura — precisa de certificado
producaoA nota de verdade, com valor fiscal

Exemplo

JSON
{
  "valorServico": 100,
  "discriminacao": "Suporte técnico — outubro/2026",
  "tomador": {
    "tipoPessoa": "J",
    "cpfCnpj": "11222333000181",
    "nome": "EMPRESA EXEMPLO LTDA",
    "endereco": {
      "cep": "01001000",
      "logradouro": "Rua Exemplo",
      "numero": "100",
      "bairro": "Centro",
      "codigoIbge": "3550308"
    }
  }
}

Respostas

Campos da resposta 200

CampoTipoDescrição
valores
obrigatório
object

Valores calculados para a prévia.

valores.serviconumber

Valor do serviço prestado.

valores.deducoesnumber

Valor das deduções consideradas.

valores.descontoIncondicionadonumber

Valor do desconto incondicionado.

valores.descontoCondicionadonumber

Valor do desconto condicionado.

valores.baseCalculonumber

Base de cálculo apurada para o ISS.

valores.aliquotaIssnumber

Alíquota de ISS aplicada no cálculo, em percentual.

valores.issnumber

Valor de ISS apurado.

valores.issRetidoboolean

Indica a retenção do ISS.

valores.retencoesFederaisobject

Valores de retenções federais.

valores.retencoesFederais.pisnumber

Valor da retenção de PIS.

valores.retencoesFederais.cofinsnumber

Valor da retenção de COFINS.

valores.retencoesFederais.csllnumber

Valor da retenção de CSLL.

valores.retencoesFederais.irnumber

Valor da retenção de Imposto de Renda.

valores.retencoesFederais.inssnumber

Valor da retenção de INSS.

valores.liquidonumber

Valor líquido da prestação.

aliquotaEnviadanumber ou null

O que vai no documento (null = alíquota não enviada).

incidenciaIssobject

Município e regra de incidência de ISS.

incidenciaIss.codigoIbgestring

Código IBGE do município de incidência.

incidenciaIss.regrastring

Identificador da regra usada na determinação do local de incidência.

incidenciaIbsCbsobject

Município e regra de incidência de IBS/CBS.

incidenciaIbsCbs.codigoIbgestring

Código IBGE do município de incidência.

incidenciaIbsCbs.regrastring

Identificador da regra usada na determinação do local de incidência.

padrao
obrigatório
string

Padrão de NFS-e considerado no cálculo.

avisos
obrigatório
array de object

Avisos e observações sobre o resultado calculado.

avisos[].code
obrigatório
string
avisos[].mensagem
obrigatório
string
avisos[].bloqueante
obrigatório
boolean

true = com este aviso a nota não pode ser emitida (o POST /nfse responderia erro); corrija antes. false = só informa.

Exemplo de resposta 200

JSON
{
  "valores": {
    "servico": 100,
    "baseCalculo": 100,
    "aliquotaIss": 3,
    "iss": 0,
    "liquido": 100
  },
  "aliquotaEnviada": null,
  "incidenciaIss": {
    "codigoIbge": "3547809",
    "regra": "estabelecimento_prestador"
  },
  "incidenciaIbsCbs": {
    "codigoIbge": "3550308",
    "regra": "domicilio_adquirente"
  },
  "padrao": "gissonline",
  "avisos": [
    {
      "code": "aliquota_nao_enviada",
      "mensagem": "Simples sem retenção: a alíquota é calculada mas não vai no RPS.",
      "bloqueante": false
    }
  ]
}
← Voltar ao início