Pular para o conteúdo

Criar OS a partir de outro sistema

Um chamado entra no seu sistema de atendimento, na sua central de monitoramento ou no seu ERP, e precisa virar uma ordem de serviço para a equipe de campo. Este guia abre a OS pela API e mostra como acompanhar o que acontece com ela depois.

A OS criada pela API é igual à criada pelo painel: conta nas cotas do plano, ganha o número da empresa, tem o total calculado e aplica os checklists automáticos que a empresa configurou.

PermissãoPara quê
service_orders:readLer os tipos de OS e acompanhar a OS
service_orders:createCriar a OS
service_orders:updateMudar a situação, iniciar, concluir e cancelar
team:readOpcional. Achar o técnico responsável
appointments:createSó se a OS for criar o compromisso na agenda (create_appointment)
finance:createSó se a conclusão for lançar a receita (link_financial_transaction)
quotes:readSó para converter orçamento em OS (from_quote). O membro também precisa de acesso a orçamentos

Três leituras resolvem quase todo 422 antes de ele acontecer. Faça uma vez e guarde; elas mudam pouco.

  • Tipos de OS. GET /public/v1/service_order_types lista os tipos cadastrados (CFTV, alarme, portão). O id de cada um é o valor de type_id. Quando required_on_create vem true, a empresa exige tipo, e criar sem type_id responde 422. Tipo com active: false saiu do seletor do painel.
  • Técnicos. GET /public/v1/team traz a equipe. Os técnicos vêm com type: "technician", e o id deles vai em technician_id e em support_technician_ids.
  • Cliente. A OS pode apontar para um cadastro (client_id), e aí ele precisa ser da empresa. Se você ainda não liga os clientes dos dois sistemas, veja Sincronizar clientes com CRM ou ERP.

A empresa também pode marcar, na configuração de OS do painel, campos obrigatórios na abertura. A API cobra os mesmos campos, e o que faltar volta em errors no 422.

Terminal window
# 1. Os tipos de OS da empresa (guarde; muda pouco)
curl "https://api.fatureihoje.com/public/v1/service_order_types?limit=100" \
-H "Authorization: Bearer $FH_API_KEY"
# 2. Criar a OS. A chave de idempotência vem do número do chamado.
curl -X POST "https://api.fatureihoje.com/public/v1/service_orders" \
-H "Authorization: Bearer $FH_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: chamado-4821" \
-d '{
"client_id": "0d9a7c5e-3f1b-4d2a-8c6e-4a2b0c8e6f1d",
"client_name": "Marcenaria Souza",
"client_phone": "+5511988887777",
"client_description": "O portão eletrônico não fecha até o fim.",
"service_address": "Rua das Flores, 120, São Paulo, SP",
"type_id": "7b1e4c2a-9d3f-4a6b-8c5e-1f2a3b4c5d6e",
"scheduled_start": "2026-10-05T12:00:00Z",
"scheduled_end": "2026-10-05T14:00:00Z",
"priority": "high",
"internal_notes": "Chamado 4821 do sistema de atendimento",
"items": [
{
"description": "Visita técnica",
"quantity": 1,
"unit_price_cents": 15000,
"total_cents": 15000
}
]
}'

O que vale saber sobre os campos (a lista inteira está na Referência):

  • client_name é obrigatório mesmo com client_id: é o nome como sai na OS, e continua lá se o cadastro for excluído.
  • Com scheduled_start a OS nasce scheduled; sem ele, pending.
  • Dinheiro vai em centavos. O painel guarda o total_cents de cada item como você mandou, sem recalcular pela quantidade, e o subtotal da OS é a soma deles. Veja Datas e dinheiro.
  • A OS não tem campo para o id do seu sistema. Guarde o id da OS no seu chamado e, se quiser que a equipe veja o número do chamado, ponha em internal_notes, que não sai no documento do cliente.

No exemplo, a Idempotency-Key é chamado-4821. Assim, se o seu sistema mandar o mesmo chamado duas vezes (um retry de fila, um operador clicando de novo), a segunda chamada devolve a OS da primeira em vez de abrir outra.

Dois cuidados:

  • A resposta fica guardada por 24 horas. Depois disso, a mesma chave cria de novo. Por isso guarde o id da OS no chamado assim que ela voltar, e confira esse campo antes de criar.
  • A mesma chave com um corpo diferente responde 422 idempotency_key_reused. Se o chamado mudou antes de a OS ser criada, é outra operação.

Veja Idempotência.

São os mesmos do formulário do painel, e desligados por padrão:

  • send_to_technician: true avisa o técnico responsável e a equipe de apoio pelo WhatsApp depois de criar. Sem technician_id, ninguém é avisado.
  • create_appointment: true, junto com scheduled_start, cria o compromisso na agenda e o espelha no Google Agenda de quem conectou. Pede appointments:create na chave.

A OS anda pelas mesmas ações dos botões do painel:

AçãoRota
Mudar a situação (qualquer uma para qualquer outra)POST /public/v1/service_orders/{id}/status
IniciarPOST /public/v1/service_orders/{id}/start
Concluir, com a opção de lançar a receitaPOST /public/v1/service_orders/{id}/complete
CancelarPOST /public/v1/service_orders/{id}/cancel
EditarPATCH /public/v1/service_orders/{id}

OS concluída ou cancelada não aceita edição, início, conclusão nem cancelamento: a resposta é 409 conflict. Para reabrir, mude a situação pela rota de situação. Concluir respeita o checklist obrigatório e a ordem de conclusão do técnico, e responde 409 quando falta algo.

Para saber quando o técnico iniciou ou concluiu, não fique consultando a OS. Inscreva um endpoint em service_order.status_changed e service_order.updated (veja Criar um endpoint), e use a sincronização incremental como rede de segurança.

Se o seu fluxo começa num orçamento do Faturei Hoje, não recrie os itens na mão: POST /public/v1/service_orders/from_quote converte um orçamento aprovado em OS, pela mesma conversão da janela do painel. Ela pede quotes:read na chave e acesso a orçamentos para o membro da chave.

RespostaO que fazer
422 validation_failedCampo inválido ou obrigatório da empresa faltando. O campo vem em errors
404 resource_not_foundCliente ou técnico que não existe ou não é da empresa
403 plan_limit_reachedA cota de OS do plano acabou. A empresa resolve no painel
403 permission_missingFalta permissão na chave, como appointments:create com create_appointment
429 rate_limit_exceededEspere o Retry-After e repita. Veja Limites de uso
5xx ou falha de redeRepita com a mesma Idempotency-Key