API de integração do PMOC Fácil
Envie clientes, árvore de locais, inventário de equipamentos e plano de manutenção do seu sistema (ERP, CMMS ou app de campo) direto para uma conta do PMOC Fácil. A API prepara os dados; o documento continua sendo revisado e assinado por um responsável técnico no painel.
Precisa de uma chave? Gere em Painel → Configurações → Integração.
1. Visão geral
A integração é push: o seu sistema envia os dados por HTTPS e recebe de volta os identificadores criados, as contagens por bloco e o percentual de preenchimento do PMOC, com a lista do que ainda falta para o documento ficar completo.
- Base:
https://pmocfacil.com - Formato: JSON (UTF-8),
Content-Type: application/json - Versão do contrato:
1(campo opcionalversaono payload) - Um envio = um cliente/edificação, com seus locais, equipamentos e plano
- Nenhum envio gera PMOC assinado automaticamente
O que normalmente não existe no sistema de origem e precisa ser completado no painel: área (m²), população fixa/flutuante e atividade por ambiente climatizado, e os dados do responsável técnico (formação, conselho, registro, ART e validade).
2. Autenticação
Cada conta assinante gera seus próprios tokens. O token define a conta de destino: tudo que entra fica isolado nela. Envie em um dos dois cabeçalhos:
Authorization: Bearer SEU_TOKEN
# ou
x-api-key: SEU_TOKEN- O token é exibido uma única vez na criação — guarde em cofre de segredos.
- Só o prefixo fica visível no painel; o valor é armazenado como hash.
- Revogar uma chave invalida imediatamente todos os envios que a usam.
- Tokens de contas sem plano mensal ativo são recusados com
401. - Use uma chave por ambiente (produção/homologação) para revogar sem parar o resto.
3. Endpoints
| Método | Caminho | Para quê |
|---|---|---|
POST | /api/public/integracoes/confirm8/clientes | Cria ou atualiza cliente, locais, equipamentos e plano de manutenção. |
GET | /api/public/integracoes/confirm8/clientes/{referencia_externa} | Consulta o estado atual: contagens, PMOCs gerados e pendências de preenchimento. |
4. Estrutura do payload
Quatro blocos, sendo apenas cliente obrigatório:
{
"versao": "1",
"cliente": { ... }, // obrigatório
"locais": [ ... ], // opcional (até 2000)
"equipamentos": [ ... ], // opcional (até 5000)
"plano_manutencao": { // opcional
"nome": "...",
"mes_inicio": 1,
"itens": [ ... ] // até 2000
}
}Campos desconhecidos são ignorados. Números aceitam string ("24000" ou "42,5") e são normalizados. Strings são aparadas e truncadas no limite do campo. null equivale a ausente.
5. Dicionário de campos
5.1 cliente
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
referencia_externa | string (1-120) | sim | Identificador do cliente no seu sistema. É a chave de idempotência: reenviar o mesmo valor atualiza o cadastro em vez de duplicar. |
razao_social | string (2-200) | sim | Razão social da empresa/edificação. |
nome_fantasia | string (200) | — | Nome fantasia usado no documento quando informado. |
cnpj | string (20) | — | CNPJ com ou sem máscara. Exigido pela norma no documento final. |
endereco | string (300) | — | Logradouro, número e complemento da edificação. |
cidade | string (120) | — | Município da edificação. |
uf | string (2) | — | Sigla do estado (ex.: SP). |
telefone | string (40) | — | Telefone de contato do cliente. |
email | string (200) | — | E-mail de contato do cliente. |
tipo_edificacao | string (80) | — | Ex.: Hospital / clínica, Escritório, Escola, Shopping. |
responsavel_local | string (150) | — | Pessoa responsável pela edificação (não é o responsável técnico do PMOC). |
5.2 locais[]
A hierarquia é montada por referencia_pai, com profundidade livre (prédio → pavimento → área → sala). Envie o pai antes ou depois — a ordem não importa.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
referencia_externa | string (1-120) | sim | Id do local no seu sistema. Usado para hierarquia e idempotência. |
referencia_pai | string (120) | — | referencia_externa do local pai. Vazio = raiz. A árvore aceita profundidade livre. |
nome | string (1-160) | sim | Nome exibido no documento (ex.: 2º pavimento, Centro cirúrgico 201). |
tipo | enum: predio | pavimento | area | sala | outro | — | Padrão "outro". |
climatizado | boolean | — | Padrão true. Locais climatizados entram no inventário de ambientes do PMOC. |
area_m2 | number (0-1.000.000) | — | Área do ambiente em m². Exigida pela norma para ambientes climatizados. |
populacao_fixa | number (0-100.000) | — | Número de ocupantes fixos do ambiente. |
populacao_flutuante | number (0-1.000.000) | — | Número de ocupantes flutuantes do ambiente. |
tipo_atividade | string (120) | — | Atividade exercida no ambiente (ex.: Cirurgia, Atendimento, Sala de aula). |
5.3 equipamentos[]
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
referencia_externa | string (1-120) | sim | Id do equipamento no seu sistema (idempotência). |
local | string (120) | — | referencia_externa do local onde o equipamento está instalado. |
tag | string (1-80) | sim | TAG/identificação do ativo (ex.: AC-201). |
tipo_equipamento | enum: split | self-contained | fancoil | chiller | VRF | torre de resfriamento | — | Define o plano de atividades aplicável por tipo. |
marca | string (80) | — | Fabricante. |
modelo | string (120) | — | Modelo do equipamento. |
serie | string (80) | — | Número de série. |
tensao | string (30) | — | Tensão de alimentação (ex.: 220V). |
capacidade_btu_h | number (0-10.000.000) | — | Capacidade em BTU/h. |
ano_fabricacao | number (1950-2100) | — | Ano de fabricação. |
quantidade | number (1-9999) | — | Quantidade de equipamentos idênticos nesse local. |
observacao | string (600) | — | Observações técnicas livres. |
5.4 plano_manutencao
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
nome | string (160) | — | Nome do plano; vira um modelo reutilizável na biblioteca da conta. |
mes_inicio | number (1-12) | — | Mês em que o ciclo anual começa. |
itens[] | array (até 2000) | — | Atividades do plano (ver tabela abaixo). |
5.5 plano_manutencao.itens[]
Informe tipo_equipamento para aplicar a atividade a todos os ativos daquele tipo, ou tag para um ativo específico.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
tipo_equipamento | enum: split | self-contained | fancoil | chiller | VRF | torre de resfriamento | — | Aplica a atividade a todos os equipamentos desse tipo. |
tag | string (80) | — | Aplica a atividade apenas a um ativo específico. |
componente | string (1-160) | sim | Componente inspecionado (ex.: Filtros de ar, Bandeja de condensado). |
atividade | string (1-400) | sim | Descrição da atividade a ser executada. |
periodicidade | enum: Mensal | Trimestral | Semestral | Anual | Avulsa | sim | Frequência de execução da atividade. |
referencia | string (160) | — | Referência normativa (ex.: Portaria 3.523/98, NBR 13971). |
6. Idempotência e atualização
Toda entidade carrega referencia_externa. A chave de unicidade é conta + referencia_externa, então:
- Reenviar o mesmo cliente atualiza o cadastro (nunca duplica).
- Locais e equipamentos seguem a mesma regra, individualmente.
- Contas diferentes podem usar as mesmas referências sem colisão.
- A resposta traz
criadoe contagens de criados/atualizados por bloco. - Reenvio é seguro para retentativa após timeout ou erro de rede.
Envios não fazem exclusão: remover um equipamento no sistema de origem não o apaga no PMOC Fácil. Ajustes de baixa são feitos no painel.
7. Exemplos completos
7.1 Envio (POST)
curl -X POST https://pmocfacil.com/api/public/integracoes/confirm8/clientes \
-H "Authorization: Bearer SEU_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"versao": "1",
"cliente": {
"referencia_externa": "CLI-1042",
"razao_social": "Hospital Santa Clara Ltda",
"nome_fantasia": "Santa Clara",
"cnpj": "12.345.678/0001-90",
"endereco": "Av. Paulista, 1000",
"cidade": "São Paulo",
"uf": "SP",
"telefone": "11988887777",
"email": "manutencao@santaclara.com.br",
"tipo_edificacao": "Hospital / clínica",
"responsavel_local": "Eng. Ana Souza"
},
"locais": [
{
"referencia_externa": "L-1",
"referencia_pai": null,
"nome": "Prédio Central",
"tipo": "predio",
"climatizado": false,
"area_m2": null,
"populacao_fixa": null,
"populacao_flutuante": null,
"tipo_atividade": null
},
{
"referencia_externa": "L-1-2",
"referencia_pai": "L-1",
"nome": "2º pavimento",
"tipo": "pavimento",
"climatizado": false,
"area_m2": null,
"populacao_fixa": null,
"populacao_flutuante": null,
"tipo_atividade": null
},
{
"referencia_externa": "L-1-2-201",
"referencia_pai": "L-1-2",
"nome": "Centro cirúrgico 201",
"tipo": "sala",
"climatizado": true,
"area_m2": 42.5,
"populacao_fixa": 6,
"populacao_flutuante": 12,
"tipo_atividade": "Cirurgia"
}
],
"equipamentos": [
{
"referencia_externa": "EQ-9001",
"local": "L-1-2-201",
"tag": "AC-201",
"tipo_equipamento": "fancoil",
"marca": "Carrier",
"modelo": "42BQA024",
"serie": "SN789012",
"tensao": "220V",
"capacidade_btu_h": 24000,
"ano_fabricacao": 2019,
"quantidade": 1,
"observacao": "Atende sala limpa"
}
],
"plano_manutencao": {
"nome": "Plano preventivo Confirm8",
"mes_inicio": 1,
"itens": [
{
"tipo_equipamento": "fancoil",
"tag": null,
"componente": "Filtros de ar",
"atividade": "Verificar, limpar e substituir quando saturado",
"periodicidade": "Mensal",
"referencia": "Portaria 3.523/98 · NBR 13971"
},
{
"tipo_equipamento": "fancoil",
"tag": null,
"componente": "Bandeja de condensado",
"atividade": "Limpeza, remoção de biofilme e teste de escoamento",
"periodicidade": "Mensal",
"referencia": "RE-09/2003"
}
]
}
}'7.2 Resposta do envio
{
"ok": true,
"edificacao_id": "8f2c…",
"referencia_externa": "CLI-1042",
"criado": true,
"locais": { "criados": 3, "atualizados": 0 },
"equipamentos": { "criados": 1, "atualizados": 0 },
"atividades": 2,
"completude": {
"percentual": 76,
"pendencias": [
"Responsável técnico: conselho e registro",
"ART e validade"
]
},
"revisar_em": "https://pmocfacil.com/painel"
}7.3 Consulta (GET)
curl https://pmocfacil.com/api/public/integracoes/confirm8/clientes/CLI-1042 \
-H "Authorization: Bearer SEU_TOKEN"7.4 Resposta da consulta
{
"ok": true,
"referencia_externa": "CLI-1042",
"edificacao_id": "8f2c…",
"razao_social": "Hospital Santa Clara Ltda",
"locais": 3,
"equipamentos": 1,
"pmocs_gerados": 0,
"completude": { "percentual": 76, "pendencias": ["..."] }
}8. Respostas e códigos de erro
| Status | Quando acontece | Corpo |
|---|---|---|
| 200 OK | Cliente já existia e foi atualizado. | Objeto de resposta com contagens e completude. |
| 201 Created | Cliente criado pela primeira vez. | Mesmo objeto de resposta, com criado: true. |
| 400 Bad Request | Corpo não é JSON válido ou referência ausente na consulta. | { "ok": false, "erro": "..." } |
| 401 Unauthorized | Token ausente, inválido, revogado ou de conta sem plano ativo. | { "ok": false, "erro": "Token de integração inválido." } |
| 404 Not Found | Consulta de uma referencia_externa que não existe na conta. | { "ok": false, "erro": "Cliente não encontrado." } |
| 422 Unprocessable Entity | Payload fora do contrato. Nada é gravado parcialmente. | { "ok": false, "erro": "Payload inválido.", "campos": [{ "campo": "cliente.razao_social", "mensagem": "razao_social é obrigatória" }] } |
| 500 Internal Server Error | Falha ao processar o envio (registrada no log da conta). | { "ok": false, "erro": "..." } |
Erros de validação (422) listam até 50 campos, cada um com o caminho exato (equipamentos.3.tag) e a mensagem. Nesse caso nada é gravado.
9. Limites e boas práticas
- Um cliente por requisição; até 2000 locais, 5000 equipamentos e 2000 atividades.
- Envie o inventário completo do cliente em um único POST — é mais rápido e consistente que fatiar.
- Retentativa recomendada: 3 tentativas com espera exponencial (2s, 8s, 30s) para
5xxe timeout. - Não retente
401nem422— corrija token ou payload. - Cada envio fica registrado no painel da conta (data, cliente, itens, resultado e erro).
- Use HTTPS sempre; nunca coloque o token em URL, log ou código-fonte do cliente.
- Trate o percentual de preenchimento retornado como um checklist para o usuário final.
10. Checklist antes de ir para produção
- Chave gerada para o ambiente correto e guardada em cofre de segredos.
- Mapeamento de
referencia_externadefinido e estável para cliente, local e equipamento. - Tipos de equipamento e periodicidades mapeados para os valores aceitos.
- Reenvio testado: segundo POST atualiza sem duplicar.
- Tratamento de
401,422e5xximplementado com log. - Consulta
GETexibindo pendências para o usuário do seu sistema. - Responsável técnico cadastrado no painel para permitir a assinatura do documento.
Dúvidas de integração: contato@pmocfacil.com.