API v1

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 opcional versao no 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étodoCaminhoPara quê
POST
/api/public/integracoes/confirm8/clientesCria 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

Campos do bloco cliente
CampoTipoObrigatórioDescrição
referencia_externastring (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_socialstring (2-200)
sim
Razão social da empresa/edificação.
nome_fantasiastring (200)Nome fantasia usado no documento quando informado.
cnpjstring (20)CNPJ com ou sem máscara. Exigido pela norma no documento final.
enderecostring (300)Logradouro, número e complemento da edificação.
cidadestring (120)Município da edificação.
ufstring (2)Sigla do estado (ex.: SP).
telefonestring (40)Telefone de contato do cliente.
emailstring (200)E-mail de contato do cliente.
tipo_edificacaostring (80)Ex.: Hospital / clínica, Escritório, Escola, Shopping.
responsavel_localstring (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.

Campos do bloco locais
CampoTipoObrigatórioDescrição
referencia_externastring (1-120)
sim
Id do local no seu sistema. Usado para hierarquia e idempotência.
referencia_paistring (120)referencia_externa do local pai. Vazio = raiz. A árvore aceita profundidade livre.
nomestring (1-160)
sim
Nome exibido no documento (ex.: 2º pavimento, Centro cirúrgico 201).
tipoenum: predio | pavimento | area | sala | outroPadrão "outro".
climatizadobooleanPadrão true. Locais climatizados entram no inventário de ambientes do PMOC.
area_m2number (0-1.000.000)Área do ambiente em m². Exigida pela norma para ambientes climatizados.
populacao_fixanumber (0-100.000)Número de ocupantes fixos do ambiente.
populacao_flutuantenumber (0-1.000.000)Número de ocupantes flutuantes do ambiente.
tipo_atividadestring (120)Atividade exercida no ambiente (ex.: Cirurgia, Atendimento, Sala de aula).

5.3 equipamentos[]

Campos do bloco equipamentos
CampoTipoObrigatórioDescrição
referencia_externastring (1-120)
sim
Id do equipamento no seu sistema (idempotência).
localstring (120)referencia_externa do local onde o equipamento está instalado.
tagstring (1-80)
sim
TAG/identificação do ativo (ex.: AC-201).
tipo_equipamentoenum: split | self-contained | fancoil | chiller | VRF | torre de resfriamentoDefine o plano de atividades aplicável por tipo.
marcastring (80)Fabricante.
modelostring (120)Modelo do equipamento.
seriestring (80)Número de série.
tensaostring (30)Tensão de alimentação (ex.: 220V).
capacidade_btu_hnumber (0-10.000.000)Capacidade em BTU/h.
ano_fabricacaonumber (1950-2100)Ano de fabricação.
quantidadenumber (1-9999)Quantidade de equipamentos idênticos nesse local.
observacaostring (600)Observações técnicas livres.

5.4 plano_manutencao

Campos do plano de manutenção
CampoTipoObrigatórioDescrição
nomestring (160)Nome do plano; vira um modelo reutilizável na biblioteca da conta.
mes_inicionumber (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.

Campos das atividades do plano
CampoTipoObrigatórioDescrição
tipo_equipamentoenum: split | self-contained | fancoil | chiller | VRF | torre de resfriamentoAplica a atividade a todos os equipamentos desse tipo.
tagstring (80)Aplica a atividade apenas a um ativo específico.
componentestring (1-160)
sim
Componente inspecionado (ex.: Filtros de ar, Bandeja de condensado).
atividadestring (1-400)
sim
Descrição da atividade a ser executada.
periodicidadeenum: Mensal | Trimestral | Semestral | Anual | Avulsa
sim
Frequência de execução da atividade.
referenciastring (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 criado e 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

StatusQuando aconteceCorpo
200 OKCliente já existia e foi atualizado.Objeto de resposta com contagens e completude.
201 CreatedCliente criado pela primeira vez.Mesmo objeto de resposta, com criado: true.
400 Bad RequestCorpo não é JSON válido ou referência ausente na consulta.{ "ok": false, "erro": "..." }
401 UnauthorizedToken ausente, inválido, revogado ou de conta sem plano ativo.{ "ok": false, "erro": "Token de integração inválido." }
404 Not FoundConsulta de uma referencia_externa que não existe na conta.{ "ok": false, "erro": "Cliente não encontrado." }
422 Unprocessable EntityPayload 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 ErrorFalha 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 5xx e timeout.
  • Não retente 401 nem 422 — 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_externa definido 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, 422 e 5xx implementado com log.
  • Consulta GET exibindo 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.