Ir al contenido

Crear OS desde otro sistema

Un ticket entra en su sistema de atención, en su central de monitoreo o en su ERP, y tiene que convertirse en una orden de servicio para el equipo de campo. Esta guía abre la OS por la API y muestra cómo seguir lo que pasa con ella después.

La OS creada por la API es igual a la creada en el panel: cuenta en las cuotas del plan, recibe el número de la empresa, tiene el total calculado y aplica los checklists automáticos que la empresa configuró.

PermisoPara qué
service_orders:readLeer los tipos de OS y seguir la OS
service_orders:createCrear la OS
service_orders:updateCambiar el estado, iniciar, concluir y cancelar
team:readOpcional. Encontrar al técnico responsable
appointments:createSolo si la OS va a crear la cita en la agenda (create_appointment)
finance:createSolo si la conclusión va a registrar el ingreso (link_financial_transaction)
quotes:readSolo para convertir un presupuesto en OS (from_quote). El miembro también necesita acceso a presupuestos

Antes de la primera OS: lo que exige la empresa

Sección titulada «Antes de la primera OS: lo que exige la empresa»

Tres lecturas evitan casi todo 422 antes de que ocurra. Hágalas una vez y guárdelas; cambian poco.

  • Tipos de OS. GET /public/v1/service_order_types lista los tipos registrados (CCTV, alarma, portón). El id de cada uno es el valor de type_id. Cuando required_on_create viene true, la empresa exige tipo, y crear sin type_id responde 422. Un tipo con active: false salió del selector del panel.
  • Técnicos. GET /public/v1/team trae el equipo. Los técnicos vienen con type: "technician", y su id va en technician_id y en support_technician_ids.
  • Cliente. La OS puede apuntar a un registro (client_id), y en ese caso tiene que ser de la empresa. Si todavía no vincula los clientes de los dos sistemas, vea Sincronizar clientes con un CRM o ERP.

La empresa también puede marcar, en la configuración de OS del panel, campos obligatorios al abrir. La API exige los mismos campos, y lo que falte vuelve en errors en el 422.

Ventana de terminal
# 1. Los tipos de OS de la empresa (guárdelos; cambian poco)
curl "https://api.fatureihoje.com/public/v1/service_order_types?limit=100" \
-H "Authorization: Bearer $FH_API_KEY"
# 2. Crear la OS. La clave de idempotencia sale del número del ticket.
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: ticket-4821" \
-d '{
"client_id": "0d9a7c5e-3f1b-4d2a-8c6e-4a2b0c8e6f1d",
"client_name": "Marcenaria Souza",
"client_phone": "+5511988887777",
"client_description": "El portón eléctrico no cierra del todo.",
"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": "Ticket 4821 del sistema de atención",
"items": [
{
"description": "Visita técnica",
"quantity": 1,
"unit_price_cents": 15000,
"total_cents": 15000
}
]
}'

Lo que conviene saber de los campos (la lista completa está en la Referencia):

  • client_name es obligatorio aun con client_id: es el nombre como sale en la OS, y sigue ahí si el registro se elimina.
  • Con scheduled_start la OS nace scheduled; sin él, pending.
  • El dinero va en centavos. El panel guarda el total_cents de cada ítem tal como usted lo envió, sin recalcular por la cantidad, y el subtotal de la OS es la suma de ellos. Vea Fechas y dinero.
  • La OS no tiene un campo para el id de su sistema. Guarde el id de la OS en su ticket y, si quiere que el equipo vea el número del ticket, póngalo en internal_notes, que no sale en el documento del cliente.

En el ejemplo, la Idempotency-Key es ticket-4821. Así, si su sistema envía el mismo ticket dos veces (un reintento de cola, un operador que vuelve a hacer clic), la segunda llamada devuelve la OS de la primera en vez de abrir otra.

Dos cuidados:

  • La respuesta queda guardada 24 horas. Después de eso, la misma clave vuelve a crear. Por eso, guarde el id de la OS en el ticket apenas vuelva, y revise ese campo antes de crear.
  • La misma clave con un cuerpo diferente responde 422 idempotency_key_reused. Si el ticket cambió antes de que se creara la OS, es otra operación.

Vea Idempotencia.

Son los mismos del formulario del panel, y vienen desactivados:

  • send_to_technician: true avisa al técnico responsable y al equipo de apoyo por WhatsApp después de crear. Sin technician_id, no se avisa a nadie.
  • create_appointment: true, junto con scheduled_start, crea la cita en la agenda y la refleja en el Google Calendar de quien lo haya conectado. Pide appointments:create en la clave.

La OS avanza con las mismas acciones de los botones del panel:

AcciónRuta
Cambiar el estado (de cualquiera a cualquiera)POST /public/v1/service_orders/{id}/status
IniciarPOST /public/v1/service_orders/{id}/start
Concluir, con la opción de registrar el ingresoPOST /public/v1/service_orders/{id}/complete
CancelarPOST /public/v1/service_orders/{id}/cancel
EditarPATCH /public/v1/service_orders/{id}

Una OS concluida o cancelada no acepta edición, inicio, conclusión ni cancelación: la respuesta es 409 conflict. Para reabrirla, cambie el estado por la ruta de estado. Concluir respeta el checklist obligatorio y el orden de conclusión del técnico, y responde 409 cuando falta algo.

Para saber cuándo el técnico inició o concluyó, no consulte la OS una y otra vez. Suscriba un endpoint a service_order.status_changed y service_order.updated (vea Crear un endpoint), y use la sincronización incremental como red de seguridad.

Si su flujo empieza en un presupuesto de Faturei Hoje, no vuelva a cargar los ítems a mano: POST /public/v1/service_orders/from_quote convierte un presupuesto aprobado en OS, con la misma conversión de la ventana del panel. Pide quotes:read en la clave y acceso a presupuestos para el miembro de la clave.

RespuestaQué hacer
422 validation_failedUn campo inválido, o falta un campo que la empresa exige. El campo viene en errors
404 resource_not_foundUn cliente o técnico que no existe o no es de la empresa
403 plan_limit_reachedSe agotó la cuota de OS del plan. La empresa lo resuelve en el panel
403 permission_missingLe falta un permiso a la clave, como appointments:create con create_appointment
429 rate_limit_exceededEspere el Retry-After y repita. Vea Límites de uso
5xx o falla de redRepita con la misma Idempotency-Key