Weesy Docs

Recorrência de NFS-e

Criar uma recorrência

POST https://apifiscal.weesy.com.br/v1/recorrencias

Abrir na referência interativa

Programa a emissão da mesma nota em várias datas: um modelo (os campos da emissão que se repetem) e uma lista de ocorrências (data prevista e valor). A Weesy emite cada ocorrência sozinha, às 08:00 de Brasília da data prevista, em produção.

Notas de integradores ficam guardadas na fila até a liberação do parceiro, como qualquer nota emitida pela API. Acompanhe pelo GET /recorrencias/{id} e pelos webhooks da NFS-e.

Exemplo de chamada

cURL

curl --request POST \
  --url "https://apifiscal.weesy.com.br/v1/recorrencias" \
  --header "Authorization: Bearer $WEESY_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
  "cnpjEmitente": "21664333000195",
  "periodicidade": "mensal",
  "quantidade": 12,
  "primeiraData": "2026-12-05",
  "modelo": {
    "servico": {
      "id": 42
    },
    "valorServico": 450,
    "discriminacao": "Mensalidade de {mesExtenso}/{ano}",
    "tomador": {
      "tipoPessoa": "J",
      "cpfCnpj": "11222333000181",
      "nome": "EMPRESA EXEMPLO LTDA",
      "email": "financeiro@agworks.com.br",
      "endereco": {
        "cep": "01001000",
        "logradouro": "Rua Exemplo",
        "numero": "100",
        "bairro": "Centro",
        "codigoIbge": "3550308"
      }
    }
  }
}'

Node.js

const resposta = await fetch("https://apifiscal.weesy.com.br/v1/recorrencias", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.WEESY_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "cnpjEmitente": "21664333000195",
    "periodicidade": "mensal",
    "quantidade": 12,
    "primeiraData": "2026-12-05",
    "modelo": {
      "servico": {
        "id": 42
      },
      "valorServico": 450,
      "discriminacao": "Mensalidade de {mesExtenso}/{ano}",
      "tomador": {
        "tipoPessoa": "J",
        "cpfCnpj": "11222333000181",
        "nome": "EMPRESA EXEMPLO LTDA",
        "email": "financeiro@agworks.com.br",
        "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/recorrencias",
    headers={"Authorization": f"Bearer {os.environ['WEESY_TOKEN']}"},
    json={
        "cnpjEmitente": "21664333000195",
        "periodicidade": "mensal",
        "quantidade": 12,
        "primeiraData": "2026-12-05",
        "modelo": {
            "servico": {
                "id": 42,
            },
            "valorServico": 450,
            "discriminacao": "Mensalidade de {mesExtenso}/{ano}",
            "tomador": {
                "tipoPessoa": "J",
                "cpfCnpj": "11222333000181",
                "nome": "EMPRESA EXEMPLO LTDA",
                "email": "financeiro@agworks.com.br",
                "endereco": {
                    "cep": "01001000",
                    "logradouro": "Rua Exemplo",
                    "numero": "100",
                    "bairro": "Centro",
                    "codigoIbge": "3550308",
                },
            },
        },
    },
    timeout=30,
)
print(resposta.status_code, resposta.text)

PHP

<?php

$corpo = <<<'JSON'
{
  "cnpjEmitente": "21664333000195",
  "periodicidade": "mensal",
  "quantidade": 12,
  "primeiraData": "2026-12-05",
  "modelo": {
    "servico": {
      "id": 42
    },
    "valorServico": 450,
    "discriminacao": "Mensalidade de {mesExtenso}/{ano}",
    "tomador": {
      "tipoPessoa": "J",
      "cpfCnpj": "11222333000181",
      "nome": "EMPRESA EXEMPLO LTDA",
      "email": "financeiro@agworks.com.br",
      "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/recorrencias", 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 = """
    {
      "cnpjEmitente": "21664333000195",
      "periodicidade": "mensal",
      "quantidade": 12,
      "primeiraData": "2026-12-05",
      "modelo": {
        "servico": {
          "id": 42
        },
        "valorServico": 450,
        "discriminacao": "Mensalidade de {mesExtenso}/{ano}",
        "tomador": {
          "tipoPessoa": "J",
          "cpfCnpj": "11222333000181",
          "nome": "EMPRESA EXEMPLO LTDA",
          "email": "financeiro@agworks.com.br",
          "endereco": {
            "cep": "01001000",
            "logradouro": "Rua Exemplo",
            "numero": "100",
            "bairro": "Centro",
            "codigoIbge": "3550308"
          }
        }
      }
    }
    """;

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

Corpo da requisição

CampoTipoDescrição
cnpjEmitente
obrigatório
string

CNPJ sem pontos, barra ou traço (14 posições). Já aceita o CNPJ com letras, que começa a valer em 2026.

modelo
obrigatório
object

Os campos da emissão que se repetem em todas as notas, sem competencia, idIntegracao e ambiente. valorServico é o valor base das ocorrências. servicoDescricao é preenchido pela Weesy (o nome do serviço no cadastro), só para exibir.

modelo.cnpjEmitentestring

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

modelo.servico
obrigatório
object

Um dos dois — id ou codigo.

modelo.servico.idinteger
modelo.servico.codigostring

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

modelo.valorServico
obrigatório
number

Valor bruto do serviço prestado.

modelo.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.

modelo.competenciastring (date)

Padrão = data da emissão.

modelo.municipioPrestacaostring

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

modelo.tomador
obrigatório
object

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

modelo.tomador.tipoPessoa
obrigatório
string

Indica o tipo de pessoa do tomador.

Valores: F, J.

modelo.tomador.cpfCnpj
obrigatório
string

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

modelo.tomador.nome
obrigatório
string

Nome completo ou razão social do tomador.

modelo.tomador.inscricaoMunicipalstring

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

modelo.tomador.emailstring (email)

E-mail do tomador.

modelo.tomador.telefonestring

Telefone de contato do tomador.

modelo.tomador.endereco
obrigatório
object

Endereço do tomador.

modelo.tomador.endereco.cep
obrigatório
string

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

modelo.tomador.endereco.logradouro
obrigatório
string

Tipo e nome do logradouro.

modelo.tomador.endereco.numero
obrigatório
string

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

modelo.tomador.endereco.complementostring

Complemento do endereço, quando aplicável.

modelo.tomador.endereco.bairro
obrigatório
string

Bairro do endereço.

modelo.tomador.endereco.codigoIbge
obrigatório
string

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

modelo.destinatarioobject

Quando diferente do tomador (indDest = 1).

modelo.destinatario.tipoPessoa
obrigatório
string

Indica o tipo de pessoa do tomador.

Valores: F, J.

modelo.destinatario.cpfCnpj
obrigatório
string

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

modelo.destinatario.nome
obrigatório
string

Nome completo ou razão social do tomador.

modelo.destinatario.inscricaoMunicipalstring

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

modelo.destinatario.emailstring (email)

E-mail do tomador.

modelo.destinatario.telefonestring

Telefone de contato do tomador.

modelo.destinatario.endereco
obrigatório
object

Endereço do tomador.

modelo.destinatario.endereco.cep
obrigatório
string

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

modelo.destinatario.endereco.logradouro
obrigatório
string

Tipo e nome do logradouro.

modelo.destinatario.endereco.numero
obrigatório
string

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

modelo.destinatario.endereco.complementostring

Complemento do endereço, quando aplicável.

modelo.destinatario.endereco.bairro
obrigatório
string

Bairro do endereço.

modelo.destinatario.endereco.codigoIbge
obrigatório
string

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

modelo.imovelobject

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

modelo.imovel.cib
obrigatório
string

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

modelo.imovel.inscricaoImobiliariastring ou null

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

modelo.imovel.endereco
obrigatório
object

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

modelo.imovel.endereco.cep
obrigatório
string

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

modelo.imovel.endereco.logradouro
obrigatório
string

Tipo e nome do logradouro.

modelo.imovel.endereco.numero
obrigatório
string

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

modelo.imovel.endereco.complementostring

Complemento do endereço, quando aplicável.

modelo.imovel.endereco.bairro
obrigatório
string

Bairro do endereço.

modelo.imovel.endereco.codigoIbge
obrigatório
string

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

modelo.issRetidoboolean

Padrão = o do serviço.

modelo.aliquotaSimplesnumber

Obrigatória para Simples com retenção.

modelo.consumoPessoalboolean

Padrão = o do serviço.

modelo.deducoesnumber

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

modelo.descontoIncondicionadonumber

Desconto concedido sem condição.

modelo.descontoCondicionadonumber

Desconto vinculado a condição.

modelo.outrasRetencoesnumber

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

modelo.retencoesFederaisobject

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

modelo.retencoesFederais.pisnumber

Valor da retenção de PIS.

modelo.retencoesFederais.cofinsnumber

Valor da retenção de COFINS.

modelo.retencoesFederais.csllnumber

Valor da retenção de CSLL.

modelo.retencoesFederais.irnumber

Valor da retenção de Imposto de Renda.

modelo.retencoesFederais.inssnumber

Valor da retenção de INSS.

modelo.enviarEmailboolean

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

modelo.servicoDescricaostring ou null
periodicidade
obrigatório
string

Valores: semanal, quinzenal, mensal, bimestral, trimestral, semestral, anual.

quantidade
obrigatório
integer
primeiraData
obrigatório
string (date)

De hoje em diante (Brasília).

ocorrenciasarray de object

Opcional. As linhas editadas (uma por ocorrência, em ordem de data). Sem ele, geramos.

ocorrencias[].dataPrevista
obrigatório
string (date)
ocorrencias[].valor
obrigatório
number

Valor em reais, como número com 2 casas decimais (ex. 100.00). Não mande como texto.

Exemplo

JSON
{
  "cnpjEmitente": "21664333000195",
  "periodicidade": "mensal",
  "quantidade": 12,
  "primeiraData": "2026-12-05",
  "modelo": {
    "servico": {
      "id": 42
    },
    "valorServico": 450,
    "discriminacao": "Mensalidade de {mesExtenso}/{ano}",
    "tomador": {
      "tipoPessoa": "J",
      "cpfCnpj": "11222333000181",
      "nome": "EMPRESA EXEMPLO LTDA",
      "email": "financeiro@agworks.com.br",
      "endereco": {
        "cep": "01001000",
        "logradouro": "Rua Exemplo",
        "numero": "100",
        "bairro": "Centro",
        "codigoIbge": "3550308"
      }
    }
  }
}

Respostas

Campos da resposta 201

CampoTipoDescrição
id
obrigatório
string

O id que a Weesy dá ao documento. Guarde como texto e não tente interpretar.

cnpjEmitente
obrigatório
string

CNPJ sem pontos, barra ou traço (14 posições). Já aceita o CNPJ com letras, que começa a valer em 2026.

situacao
obrigatório
string

ativa (inicial); pausada (não emite); concluida (nenhuma ocorrência programada sobrou); cancelada (final).

Valores: ativa, pausada, concluida, cancelada.

periodicidade
obrigatório
string

Valores: semanal, quinzenal, mensal, bimestral, trimestral, semestral, anual.

quantidade
obrigatório
integer
primeiraData
obrigatório
string (date)
proximaDatastring (date) ou null

A menor data prevista entre as programadas.

modelo
obrigatório
object

Os campos da emissão que se repetem em todas as notas, sem competencia, idIntegracao e ambiente. valorServico é o valor base das ocorrências. servicoDescricao é preenchido pela Weesy (o nome do serviço no cadastro), só para exibir.

modelo.cnpjEmitentestring

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

modelo.servico
obrigatório
object

Um dos dois — id ou codigo.

modelo.servico.idinteger
modelo.servico.codigostring

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

modelo.valorServico
obrigatório
number

Valor bruto do serviço prestado.

modelo.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.

modelo.competenciastring (date)

Padrão = data da emissão.

modelo.municipioPrestacaostring

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

modelo.tomador
obrigatório
object

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

modelo.tomador.tipoPessoa
obrigatório
string

Indica o tipo de pessoa do tomador.

Valores: F, J.

modelo.tomador.cpfCnpj
obrigatório
string

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

modelo.tomador.nome
obrigatório
string

Nome completo ou razão social do tomador.

modelo.tomador.inscricaoMunicipalstring

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

modelo.tomador.emailstring (email)

E-mail do tomador.

modelo.tomador.telefonestring

Telefone de contato do tomador.

modelo.tomador.endereco
obrigatório
object

Endereço do tomador.

modelo.tomador.endereco.cep
obrigatório
string

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

modelo.tomador.endereco.logradouro
obrigatório
string

Tipo e nome do logradouro.

modelo.tomador.endereco.numero
obrigatório
string

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

modelo.tomador.endereco.complementostring

Complemento do endereço, quando aplicável.

modelo.tomador.endereco.bairro
obrigatório
string

Bairro do endereço.

modelo.tomador.endereco.codigoIbge
obrigatório
string

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

modelo.destinatarioobject

Quando diferente do tomador (indDest = 1).

modelo.destinatario.tipoPessoa
obrigatório
string

Indica o tipo de pessoa do tomador.

Valores: F, J.

modelo.destinatario.cpfCnpj
obrigatório
string

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

modelo.destinatario.nome
obrigatório
string

Nome completo ou razão social do tomador.

modelo.destinatario.inscricaoMunicipalstring

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

modelo.destinatario.emailstring (email)

E-mail do tomador.

modelo.destinatario.telefonestring

Telefone de contato do tomador.

modelo.destinatario.endereco
obrigatório
object

Endereço do tomador.

modelo.destinatario.endereco.cep
obrigatório
string

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

modelo.destinatario.endereco.logradouro
obrigatório
string

Tipo e nome do logradouro.

modelo.destinatario.endereco.numero
obrigatório
string

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

modelo.destinatario.endereco.complementostring

Complemento do endereço, quando aplicável.

modelo.destinatario.endereco.bairro
obrigatório
string

Bairro do endereço.

modelo.destinatario.endereco.codigoIbge
obrigatório
string

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

modelo.imovelobject

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

modelo.imovel.cib
obrigatório
string

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

modelo.imovel.inscricaoImobiliariastring ou null

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

modelo.imovel.endereco
obrigatório
object

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

modelo.imovel.endereco.cep
obrigatório
string

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

modelo.imovel.endereco.logradouro
obrigatório
string

Tipo e nome do logradouro.

modelo.imovel.endereco.numero
obrigatório
string

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

modelo.imovel.endereco.complementostring

Complemento do endereço, quando aplicável.

modelo.imovel.endereco.bairro
obrigatório
string

Bairro do endereço.

modelo.imovel.endereco.codigoIbge
obrigatório
string

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

modelo.issRetidoboolean

Padrão = o do serviço.

modelo.aliquotaSimplesnumber

Obrigatória para Simples com retenção.

modelo.consumoPessoalboolean

Padrão = o do serviço.

modelo.deducoesnumber

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

modelo.descontoIncondicionadonumber

Desconto concedido sem condição.

modelo.descontoCondicionadonumber

Desconto vinculado a condição.

modelo.outrasRetencoesnumber

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

modelo.retencoesFederaisobject

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

modelo.retencoesFederais.pisnumber

Valor da retenção de PIS.

modelo.retencoesFederais.cofinsnumber

Valor da retenção de COFINS.

modelo.retencoesFederais.csllnumber

Valor da retenção de CSLL.

modelo.retencoesFederais.irnumber

Valor da retenção de Imposto de Renda.

modelo.retencoesFederais.inssnumber

Valor da retenção de INSS.

modelo.enviarEmailboolean

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

modelo.servicoDescricaostring ou null
ocorrencias
obrigatório
array de object
ocorrencias[].numero
obrigatório
integer
ocorrencias[].dataPrevista
obrigatório
string (date)

O dia (Brasília) em que a nota sai, às 08:00; vira a competencia da nota.

ocorrencias[].valor
obrigatório
number

Valor em reais, como número com 2 casas decimais (ex. 100.00). Não mande como texto.

ocorrencias[].valorEditado
obrigatório
boolean

O valor foi mudado à mão e não acompanha o valor do modelo.

ocorrencias[].situacao
obrigatório
string
  • programada — vai ser emitida às 08:00 da data prevista;
  • emitida — a nota foi criada (acompanhe a nota em nota); final;
  • falhou — a emissão foi recusada (motivo em falha); não tentamos de novo sozinhos — corrija e use Emitir agora;
  • pulada — não será emitida (dá para desfazer até 07:59 do dia);
  • perdida — passou de 3 dias da data prevista sem emitir; use Emitir agora se ainda quiser a nota;
  • cancelada — a recorrência foi cancelada; final.

Valores: programada, emitida, falhou, pulada, perdida, cancelada.

ocorrencias[].emitirAgora
obrigatório
boolean

Marcada por Emitir agora; sai na próxima execução (até 5 min).

ocorrencias[].idIntegracaostring ou null

O da nota desta ocorrência: rec-{id}-{numero} ou rec-{id}-{numero}-m{k}.

ocorrencias[].avisadaEmstring (date-time) ou null

Quando entrou no aviso da véspera (só empresas do ERP Weesy).

ocorrencias[].motivoImpedimentoobject ou null

O que impediria a emissão, visto na véspera.

ocorrencias[].motivoImpedimento.codestring
ocorrencias[].motivoImpedimento.mensagemstring
ocorrencias[].notaobject ou null

A nota emitida, lida na hora.

ocorrencias[].nota.idstring

O id que a Weesy dá ao documento. Guarde como texto e não tente interpretar.

ocorrencias[].nota.numerostring ou null

Número da NFS-e; nulo até autorizar.

ocorrencias[].nota.statusstring

Em que pé está a nota. Novos valores podem aparecer: trate valor desconhecido sem quebrar.

ValorO que quer dizerO que fazer
recebidaRecebemos a nota e vamos enviar à prefeituraAguardar
em_processamentoEnviada à prefeitura, aguardando a respostaAguardar
autorizadaA prefeitura autorizou — a nota tem número e código de verificaçãoPronto: baixe o PDF e o XML
rejeitadaA prefeitura recusou por algum dado erradoLeia o motivo em mensagens, corrija e emita de novo com o mesmo idIntegracao
erroNão conseguimos falar com a prefeitura (fora do ar, demora)Tentar emitir de novo
cancelamento_solicitadoPedimos o cancelamento, aguardando a prefeituraAguardar
canceladaA prefeitura cancelou a nota—
cancelamento_rejeitadoA prefeitura recusou o cancelamento — a nota continua valendoLeia o motivo; às vezes é preciso cancelar no site da prefeitura
ValorSignificado
recebidaRecebemos a nota e vamos enviar à prefeitura
em_processamentoEnviada à prefeitura, aguardando a resposta
autorizadaAutorizada pela prefeitura
rejeitadaRecusada pela prefeitura — corrija e emita de novo
erroNão conseguimos falar com a prefeitura — tente de novo
cancelamento_solicitadoCancelamento pedido, aguardando a prefeitura
canceladaCancelada pela prefeitura
cancelamento_rejeitadoA prefeitura recusou o cancelamento
ocorrencias[].falhaobject ou null

Por que não saiu.

ocorrencias[].falha.codestring
ocorrencias[].falha.mensagemstring
ocorrencias[].falha.emstring (date-time)
ocorrencias[].avisoVesperastring

Só na resposta de Editar data ou valor.

Valores: com_aviso, sem_aviso.

ocorrencias[].mensagemstring

Só na resposta de Emitir agora.

criadaEm
obrigatório
string (date-time)
alteradaEm
obrigatório
string (date-time)
alertasarray de object

Só na criação e na edição do modelo — os avisos da prévia (bloqueante não impediu gravar, mas impede emitir).

alertas[].code
obrigatório
string
alertas[].mensagem
obrigatório
string
alertas[].bloqueante
obrigatório
boolean
← Voltar ao início