v1Referencia de la APIRegistros de producción

Crear registros de producción

Scope requerido: production_logs.create.

Crea uno o varios registros de producción. El cuerpo es un arreglo JSON, incluso para un solo registro.

Este es el endpoint que usa un MES, ERP o terminal de planta para enviar producción a Pulsar. machine y sku son referencias que aceptan un id o un name, así que un sistema que solo conoce nombres de línea y códigos de producto no tiene que resolver primero los IDs de Pulsar.

Un registro de producción describe un intervalo cerrado: start y end son obligatorios, end es igual o posterior a start, y ambos caen dentro de un solo turno de la máquina. Se aceptan turnos pasados, así que los registros pueden enviarse días después de la producción. Para registrar lo que pasa en el turno que una máquina está corriendo ahora, usa los endpoints de tiempo real.

Los defectos (type: "defects") se suman. Varios registros de defectos pueden cubrir el mismo rango, en una solicitud o en varias, y cada uno se registra, así que enviar el mismo lote dos veces lo registra dos veces. Envía cada lote una sola vez, y reintenta solo como se describe en Reintentos e Idempotency-Key abajo. start y end pueden ser el mismo instante para defectos encontrados en un momento puntual:

[
  {"type": "defects", "count": 3, "nominalSpeed": 60, "machine": {"name": "Press 4"},
   "sku": {"name": "GAL-1042"}, "start": "2026-10-12T14:00:00Z", "end": "2026-10-12T22:00:00Z"},
  {"type": "defects", "count": 1, "nominalSpeed": 60, "machine": {"name": "Press 4"},
   "sku": {"name": "GAL-1042"}, "start": "2026-10-12T17:42:10Z", "end": "2026-10-12T17:42:10Z"}
]

Los registros total y correct no pueden traslaparse con otro registro del mismo tipo, máquina y SKU. La respuesta lista los registros de esta solicitud. La calidad y el OEE de los turnos afectados se recalculan en segundo plano, normalmente en unos minutos.

Reintentos e Idempotency-Key. Que una llamada fallida haya registrado algo depende de cómo falló:

  • Una respuesta 4xx significa que la solicitud se rechazó y no se registró nada. Corrígela y envíala otra vez.
  • Un timeout, una conexión cortada o una respuesta 5xx dejan el resultado desconocido: la solicitud pudo haberse registrado aunque nunca recibiste la respuesta. Si la envías otra vez sin un Idempotency-Key, puede registrarse dos veces, así que primero revisa si se registró, por ejemplo con POST /v1/production-logs/filters.

Para reintentar de forma segura, envía un header Idempotency-Key con un valor único que generes para cada solicitud, como un UUID, y envía la misma clave y el mismo cuerpo en cada reintento de esa solicitud. La clave se guarda junto con lo que registró la solicitud, así que un reintento nunca la registra dos veces:

  • Si la solicitud original se registró, el reintento no registra nada y devuelve la respuesta original, con el header Idempotent-Replayed: true.
  • Si la original no se registró, ya sea porque se rechazó o porque falló, el reintento se procesa como una solicitud nueva.
  • Reusar una clave con una solicitud distinta, con otro cuerpo o URL, devuelve 409.
  • En el caso poco común de que la original todavía se esté procesando, el reintento devuelve 409. Vuelve a intentarlo en un momento.

Las claves son por empresa, así que todas sus API keys las comparten, y cada clave se conserva 24 horas después de la solicitud que la registró. Después de eso, una solicitud con la misma clave se procesa como nueva, así que reintenta dentro de ese plazo.

Parámetros de encabezado

Idempotency-Key?|

Opcional. Un valor único que generas para esta solicitud, como un UUID, de hasta 255 caracteres ASCII imprimibles sin espacios. Envía la misma clave cuando reintentes la solicitud: si la original se registró, se devuelve otra vez su respuesta en lugar de registrarla dos veces. Consulta Reintentos e Idempotency-Key arriba.

Cuerpo de la solicitud

application/json

Definiciones de TypeScript

Usa el tipo request body en TypeScript.

Un arreglo JSON. Cada elemento tiene estos campos:

Cuerpo de la respuesta

application/json

application/json

application/json

application/json

application/json

Pruébalo en vivo
POST
/v1/production-logs

Este endpoint requiere autenticación. Pega un token en la sección Autorización, más abajo.

curl -X POST "https://example.com/v1/production-logs" \  -H "Content-Type: application/json" \  -d '[    {      "count": 1000,      "nominalSpeed": 60,      "start": "2024-01-01T08:00:00",      "end": "2024-01-01T16:00:00",      "machine": {},      "sku": {}    }  ]'
[  {    "id": "36f7b519-d93e-4ec8-8245-7f4b8c123456",    "type": "correct",    "sensorCount": 500,    "count": 1000,    "nominalSpeed": 60,    "countingFactor": 1,    "start": "2024-01-01T00:00:00",    "end": "2024-01-01T08:00:00",    "isReviewed": true,    "isAutomated": true,    "machineId": 12,    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z",    "deletedAt": "2019-08-24T14:15:22Z",    "live": true,    "machine": {      "id": 0,      "name": "string",      "isCountEnabled": true,      "externalName": "string"    },    "company": {      "id": 0,      "name": "string",      "timezone": "string"    },    "shift": {      "id": 0,      "name": "string",      "start": "2019-08-24T14:15:22Z",      "end": "2019-08-24T14:15:22Z",      "isConsidered": true    },    "operator": {      "id": 0,      "firstName": "string",      "lastName": "string",      "email": "string"    },    "sku": {      "id": "string",      "name": "string",      "description": "string",      "unit": "string"    },    "workOrder": {      "id": "string",      "name": "string",      "description": "string",      "status": "InProgress"    },    "simpleWorkOrder": {      "id": "string",      "name": "string"    }  }]

Eliminar un operador DELETE

Elimina un operador de la lista. Los registros de producción y turnos que lo referencian quedan apuntando a un registro que ya no existe, así que para alguien que simplemente se fue, dejar el registro conserva el historial de sus turnos.

Buscar registros de producción POST

Busca registros de producción por máquina, turno, SKU, fecha, cantidad o estado de revisión. Es un POST porque el cuerpo del filtro tiene objetos anidados, pero solo lee: basta con el scope production_logs.read. Envía {} para obtener la primera página con los valores por defecto (page 1, limit 10). Los filtros son opcionales y se combinan con AND. Páginas. Los registros se ordenan por start y luego por id. La respuesta da totalCount y totalPages; pide page 1, 2, … hasta totalPages con los mismos filtros y el mismo limit para leerlos todos. Un registro escrito mientras recorres las páginas puede desplazar una posición las páginas siguientes. Fechas. startDate filtra por cuándo empieza un registro y endDate por cuándo termina. after y before excluyen el momento mismo, between incluye ambos extremos, y equal coincide con el momento exacto. Da las horas con desfase UTC. Los registros de un turno. Para revisar lo que tiene un turno, por ejemplo después de agregarle defectos, filtra por su ID de GET /v1/shifts: `json {"shifts": {"include": [48213]}, "type": {"include": ["defects"]}, "limit": 100, "page": 1} ` Un registro está en un turno cuando está en la máquina del turno y cae dentro del turno. Para solo los defectos, GET /v1/shifts/{shift_id}/defects devuelve los mismos registros en una sola lista sin paginar.