Radar DCTFWeb: Recibos
Endpoints da WebApiAlcance para consulta e download de recibos de declarações - DCTFWeb (e, opcionalmente, PGDAS-D do Simples Nacional) - obtidos através do Integra Contador do Serpro. Cobrem dois modos de coleta: anual (percorre os últimos N anos, máximo 3) e mensal (uma única competência AAAA-MM). Cada modo aceita um único CNPJ (contribuinte) ou toda a lista interna de customers (usar_lista_interna=true).
Para cada competência, o serviço chama o Serpro, extrai o PDF do recibo (quando presente, em Base64) e devolve um resumo agregado + a lista de recibos coletados.
Todos os endpoints exigem autenticação. Veja Autenticação para o fluxo de API Key. O Swagger oficial está em api.contabilidadealcance.com.br/docs.
Escopo compartilhado do recurso integra_contador
Este domínio não deriva o escopo do sufixo /radar/recibos. Todo o grupo /integra-contador/... compartilha o mesmo recurso integra_contador, então a API Key precisa dos escopos integra_contador:read / integra_contador:write - os mesmos exigidos por Guias, Pagamentos e demais rotas do Integra Contador. Como as duas rotas de recibos são POST, na prática exigem integra_contador:write.
Base path
/api/v1/integra-contador/radar/recibosEscopos necessários
integra_contador:read- leitura/consulta no recursointegra_contador(compartilhado).integra_contador:write- coleta/download de recibos (as duas rotas sãoPOST).
O recurso é integra_contador (fixo, comum a todo o prefixo /integra-contador), e o método HTTP define a ação (read para GET, write para POST/PUT/DELETE).
Endpoints
POST /integra-contador/radar/recibos/baixar-todas
Coleta/lista os recibos dos últimos N anos (anos, mínimo 1, máximo 3), para um único CNPJ ou para toda a lista interna de customers. Percorre todas as competências mensais do intervalo e, para cada CNPJ, consulta o recibo de transmissão da DCTFWeb no Serpro. O processamento roda inline em threadpool síncrono (anyio.to_thread.run_sync), sem task Celery; falhas por competência são registradas em log e não interrompem a coleta das demais.
Parâmetros
Este endpoint não recebe parâmetros de rota ou query - os dados vão no corpo da requisição (RecibosDownloadRequest): informe contribuinte (um único CNPJ) ou usar_lista_interna: true (todos os customers), com anos opcional (1 a 3, default 1). Ver Schema RecibosDownloadRequest. Se nenhum CNPJ for resolvido, retorna 422 com a mensagem "Informe 'contribuinte.numero' (CNPJ), ou 'cnpjs', ou 'usar_lista_interna=true' com customer_service válido.".
Request
{
"contribuinte": { "tipo": 2, "numero": "27898481000150" },
"anos": 1
}Alternativa - todos os customers:
{
"usar_lista_interna": true,
"anos": 1
}Response 200 OK
{
"summary": {
"total": 12,
"abertas": 0,
"pagas": 0,
"vencidas": 0,
"porTipo": { "DCTF": 12 }
},
"recibos": [
{
"id": "DCTFWeb:27898481000150:2025-06",
"tipo": "DCTF",
"competencia": "2025-06",
"clienteNumero": "27898481000150",
"descricao": "Recibo DCTFWeb - 2025-06",
"origem": "DCTFWeb",
"dataGeracao": "2026-07-03",
"pdfPath": "/caminho/RECIBO_DCTF/.../DCTFWeb_27898481000150_2025-06.pdf",
"extras": { "consulta": { "resposta": "bruta do Serpro" } }
}
]
}Em caso de erro não tratado, retorna 500 com detail: "Erro ao coletar recibos".
Escopo: integra_contador:write
POST /integra-contador/radar/recibos/baixar-mensal
Coleta/lista os recibos de uma única competência (mês), para um CNPJ ou para toda a lista interna. Ao contrário do baixar-todas, percorre apenas o mês informado. Ao coletar, registra uma atividade de auditoria via ActivityService.created_activity_dctfweb_recibo (no modo usar_lista_interna, apenas para CNPJs de matriz, contendo 0001); o processamento também roda inline em threadpool síncrono, sem Celery.
Parâmetros
Este endpoint não recebe parâmetros de rota ou query - os dados vão no corpo da requisição (RecibosMensalRequest): informe contribuinte ou usar_lista_interna: true, e a competência via competencia no formato "AAAA-MM" ou o par ano + mes. Ver Schema RecibosMensalRequest. Formato de competencia inválido retorna 422 ("Formato de 'competencia' inválido. Use 'YYYY-MM'."); ausência de competência e de ano/mes válidos retorna 422 ("Informe 'competencia' (YYYY-MM) ou 'ano' e 'mes' válidos.").
Request
{
"contribuinte": { "tipo": 2, "numero": "27898481000150" },
"competencia": "2025-06"
}Alternativa - todos os customers:
{
"usar_lista_interna": true,
"competencia": "2025-06"
}Alternativa - competência via ano + mes:
{
"contribuinte": { "tipo": 2, "numero": "27898481000150" },
"ano": 2025,
"mes": 6
}Response 200 OK
{
"summary": {
"total": 1,
"abertas": 0,
"pagas": 0,
"vencidas": 0,
"porTipo": { "DCTF": 1 }
},
"recibos": [
{
"id": "DCTFWeb:27898481000150:2025-06",
"tipo": "DCTF",
"competencia": "2025-06",
"clienteNumero": "27898481000150",
"descricao": "Recibo DCTFWeb - 2025-06",
"origem": "DCTFWeb",
"dataGeracao": "2026-07-03",
"pdfPath": "/caminho/RECIBO_DCTF/.../DCTFWeb_27898481000150_2025-06.pdf",
"extras": { "consulta": { "resposta": "bruta do Serpro" } }
}
]
}Mesmo envelope RecibosDownloadResponse do baixar-todas (summary + recibos), restrito à competência informada. Em caso de erro não tratado, retorna 500 com detail: "Erro ao coletar recibos mensais".
Escopo: integra_contador:write
Integração com o Serpro (Integra Contador)
Para cada (CNPJ, competência), o serviço RadarRecibosService consulta o Serpro assim:
- DCTFWeb (ativo):
DCTFWebService.consultar_recibo_transmissao, comdados = { "categoria": "GERAL_MENSAL", "anoPA": <ano>, "mesPA": <mes> }econtribuinte = { tipo: 2, numero: <cnpj> }. O PDF (PDFByteArrayBase64/ variações) é extraído e, se válido (> 100 chars), salvo em disco; o caminho vai empdfPath. - PGDAS-D (Simples Nacional): há suporte a
pgdasd_consultar_declaracao_receitas(serviço CONSDECREC15) com fallback parapgdasd_consultar_declaracao(CONSDECLARACAO13), usandodados = { "periodoApuracao": "AAAAMM" }. Atualmente essa coleta está desativada (comentada) no fluxo de processamento - as respostas trazem apenas recibos de origemDCTFWeb.
Sem tasks Celery neste domínio
Diferente de outros fluxos assíncronos da plataforma, os endpoints de Recibos não despacham tasks Celery. A coleta roda inline via anyio.to_thread.run_sync, bloqueando a requisição até concluir. Para muitos CNPJs (usar_lista_interna) ou muitos anos, a resposta pode demorar proporcionalmente.
Schemas
RecibosDownloadRequest
Body de POST /baixar-todas.
| Campo | Tipo | Obrigatório | Observações |
|---|---|---|---|
contribuinte | ParteIdentificacao | condicional | Um único contribuinte. Ver Schema ParteIdentificacao. |
usar_lista_interna | bool | não | Default false. Se true, coleta para todos os customers. |
anos | int (1-3) | não | Quantidade de anos retroativos a percorrer. Default 1. |
Informe contribuinte ou usar_lista_interna: true - ao menos um CNPJ precisa ser resolvido, senão 422.
RecibosMensalRequest
Body de POST /baixar-mensal.
| Campo | Tipo | Obrigatório | Observações |
|---|---|---|---|
contribuinte | ParteIdentificacao | condicional | Um único contribuinte. Ver Schema ParteIdentificacao. |
usar_lista_interna | bool | não | Default false. Se true, coleta para todos os customers. |
competencia | str | condicional | Formato AAAA-MM (regex ^\d{4}-(0[1-9]|1[0-2])$). Alternativa a ano/mes. |
ano | int | condicional | Usado quando competencia não é informada. |
mes | int (1-12) | condicional | Usado quando competencia não é informada. |
dir_saida | str | não | Diretório de saída dos PDFs (opcional). |
Informe competencia ou o par ano + mes.
ParteIdentificacao
Identifica o contribuinte na consulta ao Serpro.
| Campo | Tipo | Obrigatório | Observações |
|---|---|---|---|
tipo | int | sim | 1 = PF (CPF) | 2 = PJ (CNPJ). Recibos usam 2. |
numero | str | sim | CPF ou CNPJ, preferencialmente somente dígitos. |
RecibosDownloadResponse
Envelope de resposta comum aos dois endpoints.
| Campo | Tipo | Observações |
|---|---|---|
summary | RecibosSummary | Resumo agregado da coleta. |
recibos | List[Recibo] | Lista de recibos coletados (pode ser vazia). |
RecibosSummary
O shape é mantido idêntico ao de Guias para compatibilidade; para recibos, os campos de situação de pagamento ficam sempre em 0.
| Campo | Tipo | Observações |
|---|---|---|
total | int | Total de recibos coletados. Default 0. |
abertas | int | Sempre 0 para recibos (herdado de Guias). |
pagas | int | Sempre 0 para recibos. |
vencidas | int | Sempre 0 para recibos. |
porTipo | Dict[str,int] | Contagem por tipo (ex.: { "DCTF": 12 }). |
Recibo
| Campo | Tipo | Observações |
|---|---|---|
id | str | Identificador origem:cnpj:AAAA-MM (ex.: DCTFWeb:2789...:2025-06). |
tipo | str | DCTF | PGDAS. |
competencia | str | AAAA-MM. |
clienteNumero | str | CNPJ do cliente (somente números). |
descricao | str | null | Descrição do recibo (ex.: Recibo DCTFWeb - 2025-06). |
origem | str | DCTFWeb ou PGDAS-D. |
dataGeracao | str | null | Data da coleta (AAAA-MM-DD). |
pdfPath | str | null | Caminho do PDF salvo; null quando o Serpro não retorna PDF válido. |
extras | Dict[str,Any] | Metadados; inclui consulta com a resposta bruta do Serpro. |
Notas
- As duas rotas são
POSTe, portanto, exigemintegra_contador:write- o recursointegra_contadoré compartilhado por todo o prefixo/integra-contador. - A coleta de PGDAS-D está implementada no serviço, mas desativada (comentada) no fluxo atual; as respostas trazem apenas recibos
DCTFWeb. - Não há tasks Celery: o processamento roda inline em threadpool; coletas grandes (muitos CNPJs/anos) aumentam o tempo de resposta.
- Falhas na consulta de uma competência específica são registradas em log e não abortam a coleta das demais.
baixar-todaslimitaanosa no máximo3;baixar-mensalrestringe a coleta a uma única competência.- Relaciona-se com Radar DCTFWeb: Guias, que compartilha os helpers de resolução de CNPJs, competências e salvamento de PDF.