{"info":{"_postman_id":"7d41d735-1307-4036-beae-f75a4000e7ef","name":"RedSmart · Integraciones RH","description":"<html><head></head><body><img src=\"https://content.pstmn.io/5e8640ab-8b18-453a-a899-489d6ff39494/MDEtaGVhZGVyLnBuZw==\">\n\n<p>API REST de <strong>solo lectura</strong> para conectar RedSmartRH con su nómina o HRIS.</p>\n<img src=\"https://content.pstmn.io/5a1c6c7e-dc32-4329-b019-25e10f00f130/MDMtdHJlcy1jYW1pbm9zLnBuZw==\" alt=\"Elija%20por%20la%20pregunta%20que%20quiere%20contestar.%20Las%20tres%20usan%20la%20misma%20API%20key\">\n\n<h3 id=\"un-solo-host\">Un solo host</h3>\n<p>Todos los requests usan la variable <strong>apiHost,</strong> que vale <a href=\"https://api.red-smart.com\">https://api.red-smart.com</a>.</p>\n<p>Si ve otro host en algún request, es un error: repórtelo.</p>\n<h3 id=\"autenticación\">Autenticación</h3>\n<p>Header <code>X-Api-Key: rsk_…</code>. La genera el administrador del tenant en <strong>Integraciones → Conectores &amp; API</strong>. No hay OAuth ni token que refrescar: la key va en cada llamada.</p>\n<p>La key <strong>identifica al tenant</strong>: cada una sólo ve los datos de su empresa. No hay parámetro de empresa en ningún endpoint — si lo hubiera, sería un agujero.</p>\n<h3 id=\"convenciones\">Convenciones</h3>\n<ul>\n<li><p>Fechas en <code>YYYY-MM-DD</code>.</p>\n</li>\n<li><p>Todas las respuestas son JSON.</p>\n</li>\n<li><p><code>idEmpleado</code> es el nº de empleado cuando está asignado; si no, el id interno de RedSmart. Nunca viene vacío: es la llave para cruzar contra su catálogo.</p>\n</li>\n</ul>\n<h3 id=\"límites\">Límites</h3>\n<p>Rate limit por key. <code>checadas</code> acepta máximo 92 días por llamada; <code>movimientos</code>, 366.</p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"1395806","collectionId":"7d41d735-1307-4036-beae-f75a4000e7ef","publishedId":"2sBY4Tpxpz","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"00B87A"},"publishDate":"2026-08-01T21:34:35.000Z"},"item":[{"name":"Personal","item":[{"name":"Roster (plantilla con estatus laboral)","id":"a7e5ec79-9d4b-4ad7-892d-ae35bd0c0782","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.red-smart.com/api/ext/roster","description":"<p>La plantilla completa con su <strong>estatus laboral</strong>.</p>\n<p>⚠️ <strong><code>estatus</code> y <code>activo</code> contestan preguntas distintas y sí divergen.</strong></p>\n<ul>\n<li><code>estatus</code>: la relación laboral — <code>activo</code> · <code>baja</code> · <code>suspendido</code> · <code>sinExpediente</code>. <strong>Éste es el que debe mirar su nómina.</strong></li>\n<li><code>activo</code>: si la persona puede entrar al sistema. Alguien dado de baja puede conservar el acceso unos días.</li>\n<li><code>sinExpediente</code>: está en la red de la empresa pero no es plantilla de RH. No le toca a nómina.</li>\n</ul>\n<p>Campos de baja: <code>fechaBaja</code>, <code>motivoBaja</code>, <code>motivoBajaClave</code>, <code>fundamentoBaja</code> y <code>tipoBaja</code> (1 voluntaria · 2 involuntaria · 3 neutra) — es lo que separa <strong>finiquito</strong> de <strong>liquidación</strong>.</p>\n<p>Campos de suspensión: <code>suspendido</code>, <code>suspensionDesde</code>, <code>suspensionHasta</code> (<code>null</code> = abierta, todavía no se reanuda) y <strong><code>suspensionAfectaPago</code></strong>, ya resuelto: la suspensión con goce no suspende el pago.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-Api-Key"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7d41d735-1307-4036-beae-f75a4000e7ef","id":"7d41d735-1307-4036-beae-f75a4000e7ef","name":"RedSmart · Integraciones RH","type":"collection"}},"urlObject":{"path":["api","ext","roster"],"host":["https://api.red-smart.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"a7e5ec79-9d4b-4ad7-892d-ae35bd0c0782"},{"name":"Movimientos del periodo","id":"49be8c1d-82b1-44f5-8b2a-0fb812ffc944","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.red-smart.com/api/ext/movimientos?desde=2026-07-01&hasta=2026-07-31&soloNomina=false","description":"<p>Altas, bajas, suspensiones, reanudaciones y cambios del periodo. <strong>Es el insumo del aviso de baja al IMSS.</strong></p>\n<p>Por qué existe además del resumen de asistencia: alguien que trabajó del 1 al 15 y se fue el 15 aparece con 11 días, <strong>idéntico</strong> a quien faltó el resto del mes. Y hay que hacer cosas muy distintas con cada uno.</p>\n<p>Cada fila trae el motivo tipificado con su <strong>fundamento en la LFT</strong> y <strong><code>afectaPago</code></strong> ya resuelto — no lo derive con una fórmula.</p>\n<p>⚠️ Se filtra por <code>fechaEfectiva</code>, no por cuándo se capturó: una baja registrada tarde sigue siendo del periodo en que ocurrió.</p>\n<p>Máximo 366 días. Sin fechas, devuelve todo el histórico.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-Api-Key"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7d41d735-1307-4036-beae-f75a4000e7ef","id":"7d41d735-1307-4036-beae-f75a4000e7ef","name":"RedSmart · Integraciones RH","type":"collection"}},"urlObject":{"path":["api","ext","movimientos"],"host":["https://api.red-smart.com"],"query":[{"key":"desde","value":"2026-07-01"},{"key":"hasta","value":"2026-07-31"},{"description":{"content":"<p>true = sólo los que su nómina tiene que procesar (deja fuera cambios administrativos como el de domicilio).</p>\n","type":"text/plain"},"key":"soloNomina","value":"false"}],"variable":[]}},"response":[],"_postman_id":"49be8c1d-82b1-44f5-8b2a-0fb812ffc944"}],"id":"200aaf50-640e-4db5-9952-f53621ad15d1","description":"<p>Quién trabaja en la empresa y qué le pasó. Es lo que su nómina necesita para pagar y para dar avisos al IMSS.</p>\n<img src=\"https://content.pstmn.io/5e1fc913-e8a0-4eee-896f-3d5f13c85e3f/MDItZXN0YXR1cy1sYWJvcmFsLnBuZw==\" alt=\"estatus%20=%20¿sigue%20contratado?%20·%20activo%20=%20¿puede%20entrar%20al%20sistema?%20No%20son%20lo%20mismo.\" />","_postman_id":"200aaf50-640e-4db5-9952-f53621ad15d1","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-Api-Key"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7d41d735-1307-4036-beae-f75a4000e7ef","id":"7d41d735-1307-4036-beae-f75a4000e7ef","name":"RedSmart · Integraciones RH","type":"collection"}}},{"name":"Asistencia","item":[{"name":"Jornadas calculadas (LO QUE SE PAGA)","id":"1c09c3ce-c9f1-8879-fab4-adbc2998d11f","request":{"method":"GET","header":[],"url":"https://api.red-smart.com/api/ext/jornadas?desde=2026-07-01&hasta=2026-07-31","description":"<p><strong>El endpoint de NÓMINA.</strong> Devuelve la jornada YA CALCULADA de cada persona y día: los pares emparejados, la comida descontada, el retardo, y si el día era laborable. <strong>Máximo 92 días</strong> por llamada.</p>\n<p>⛔ <strong>No use <code>api/ext/checadas</code> para pagar.</strong> Esa es la bitácora cruda, sin emparejar; derivar el pago de ahí es lo que produce dos nóminas distintas del mismo dato.</p>\n<hr />\n<h2 id=\"⚠️-horas-extra-extramin-no-es-lo-que-se-paga\">⚠️ Horas extra: <code>extraMin</code> NO es lo que se paga</h2>\n<p>El día trae <strong>tres</strong> campos de extra, y significan cosas distintas:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Qué es</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>extraMin</code></td>\n<td><strong>Lo MEDIDO</strong> — minutos trabajados por encima del turno. Nadie los autorizó.</td>\n</tr>\n<tr>\n<td><code>extraAprobadaMin</code></td>\n<td><strong>Lo AUTORIZADO</strong> — lo que un responsable aprobó, y quedó sellado.</td>\n</tr>\n<tr>\n<td><code>extraEstado</code></td>\n<td><code>na</code> · <code>pendiente</code> · <code>aprobada</code> · <code>rechazada</code></td>\n</tr>\n<tr>\n<td><code>extraExcede</code></td>\n<td><code>1</code> si lo aprobado rebasa el tope de ley (Art. 66 y 68 LFT). Se <strong>marca</strong>, no se bloquea.</td>\n</tr>\n</tbody>\n</table>\n</div><p>⭐ <strong>Cuál pagar es decisión de la empresa, y el archivo no la toma por usted.</strong> Si su política es pagar sólo lo autorizado, use <code>extraAprobadaMin</code>. Si paga lo trabajado, use <code>extraMin</code>.</p>\n<p>🔴 <strong><code>extraAprobadaMin = 0</code> no quiere decir que no hubo extra.</strong> Quiere decir que <strong>nadie la autorizó</strong> — y con el módulo de autorización apagado, que es el default, sale <strong>cero siempre</strong>. Mire <code>extraEstado</code>: <code>na</code> es <em>nadie pidió nada</em>; <code>rechazada</code> es <em>se pidió y se negó</em>. No son lo mismo.</p>\n<hr />\n<h2 id=\"⚠️-el-archivo-dice-lo-que-le-falta--léalo-antes-de-conciliar\">⚠️ El archivo DICE lo que le falta — léalo antes de conciliar</h2>\n<ul>\n<li><code>omitidos</code> — personas activas que <strong>no salen en <code>dias</code></strong> porque <strong>nadie les asignó turno</strong>. Sin turno no hay jornada que calcular: es configuración, no ausentismo. ⛔ Si <code>omitidosDisponible</code> viene en <code>false</code>, ese arreglo vacío <strong>no es un cero medido</strong>: no se pudo leer el roster.</li>\n<li><code>incompletas</code> — días a los que les falta una marca.</li>\n<li><code>incoherentes</code> — días cuyo par <strong>no puede ser</strong> (salida anterior a la entrada). En los dos casos <code>trabajadoMin</code> viaja vacío, y por eso van <strong>aparte</strong>: no es lo mismo <em>no trabajó</em> que <em>el dato está roto</em>.</li>\n<li><code>conHueco</code> / <code>minutosEnHuecos</code> — turno partido o regreso a cubrir: horas que el archivo <strong>no cuenta</strong>.</li>\n<li><code>recortado</code> / <code>hastaEfectiva</code> — si pidió días futuros, el rango se recortó a hoy. <strong><code>hastaEfectiva</code> es el límite real de lo que trae</strong>, no <code>hasta</code>.</li>\n</ul>\n<hr />\n<p><code>estado</code> de cada día: <code>asistio</code> · <code>retardo</code> · <code>falta</code> · <code>justificado</code> · <code>descanso</code> · <code>festivoOficial</code> · <code>festivoOficialTrabajado</code> · <code>festivoPropio</code> · <code>festivoPropioTrabajado</code>.</p>\n<p><code>tipoFestivo</code>: <code>0</code> ninguno · <code>1</code> <strong>oficial</strong> (Art. 74 ⇒ prima del Art. 75) · <code>2</code> propio de la empresa.</p>\n<hr />\n<p>⚠️ Los <strong>ejemplos de respuesta</strong> (200 y 400) viven en el archivo versionado del repo: <code>docs/postman/RedSmart-Integraciones-RH.postman_collection.json</code>. El conector de Postman no puede crearlos por API.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-Api-Key"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7d41d735-1307-4036-beae-f75a4000e7ef","id":"7d41d735-1307-4036-beae-f75a4000e7ef","name":"RedSmart · Integraciones RH","type":"collection"}},"urlObject":{"path":["api","ext","jornadas"],"host":["https://api.red-smart.com"],"query":[{"description":{"content":"<p>Obligatorio (yyyy-MM-dd).</p>\n","type":"text/plain"},"key":"desde","value":"2026-07-01"},{"description":{"content":"<p>Obligatorio (yyyy-MM-dd). Rango máximo 92 días. Si pide días futuros el rango se recorta a hoy: lea <code>hastaEfectiva</code>.</p>\n","type":"text/plain"},"key":"hasta","value":"2026-07-31"}],"variable":[]}},"response":[{"id":"8f492297-573a-7e22-8321-b893325a4437","name":"200 · un día con extra APROBADA y otro sin autorizar","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.red-smart.com/api/ext/jornadas?desde=2026-07-01&hasta=2026-07-31","host":["https://api.red-smart.com"],"path":["api","ext","jornadas"],"query":[{"description":"Obligatorio (yyyy-MM-dd).","key":"desde","value":"2026-07-01"},{"description":"Obligatorio (yyyy-MM-dd). Rango máximo 92 días. Si pide días futuros el rango se recorta a hoy: lea `hastaEfectiva`.","key":"hasta","value":"2026-07-31"}]},"description":"**El endpoint de NÓMINA.** Devuelve la jornada YA CALCULADA de cada persona y día: los pares emparejados, la comida descontada, el retardo, y si el día era laborable. **Máximo 92 días** por llamada.\n\n⛔ **No use `api/ext/checadas` para pagar.** Esa es la bitácora cruda, sin emparejar; derivar el pago de ahí es lo que produce dos nóminas distintas del mismo dato.\n\n---\n\n## ⚠️ Horas extra: `extraMin` NO es lo que se paga\n\nEl día trae **tres** campos de extra, y significan cosas distintas:\n\n| Campo | Qué es |\n|---|---|\n| `extraMin` | **Lo MEDIDO** — minutos trabajados por encima del turno. Nadie los autorizó. |\n| `extraAprobadaMin` | **Lo AUTORIZADO** — lo que un responsable aprobó, y quedó sellado. |\n| `extraEstado` | `na` · `pendiente` · `aprobada` · `rechazada` |\n| `extraExcede` | `1` si lo aprobado rebasa el tope de ley (Art. 66 y 68 LFT). Se **marca**, no se bloquea. |\n\n⭐ **Cuál pagar es decisión de la empresa, y el archivo no la toma por usted.** Si su política es pagar sólo lo autorizado, use `extraAprobadaMin`. Si paga lo trabajado, use `extraMin`.\n\n🔴 **`extraAprobadaMin = 0` no quiere decir que no hubo extra.** Quiere decir que **nadie la autorizó** — y con el módulo de autorización apagado, que es el default, sale **cero siempre**. Mire `extraEstado`: `na` es *nadie pidió nada*; `rechazada` es *se pidió y se negó*. No son lo mismo.\n\n---\n\n## ⚠️ El archivo DICE lo que le falta — léalo antes de conciliar\n\n- `omitidos` — personas activas que **no salen en `dias`** porque **nadie les asignó turno**. Sin turno no hay jornada que calcular: es configuración, no ausentismo. ⛔ Si `omitidosDisponible` viene en `false`, ese arreglo vacío **no es un cero medido**: no se pudo leer el roster.\n- `incompletas` — días a los que les falta una marca.\n- `incoherentes` — días cuyo par **no puede ser** (salida anterior a la entrada). En los dos casos `trabajadoMin` viaja vacío, y por eso van **aparte**: no es lo mismo *no trabajó* que *el dato está roto*.\n- `conHueco` / `minutosEnHuecos` — turno partido o regreso a cubrir: horas que el archivo **no cuenta**.\n- `recortado` / `hastaEfectiva` — si pidió días futuros, el rango se recortó a hoy. **`hastaEfectiva` es el límite real de lo que trae**, no `hasta`.\n\n---\n\n`estado` de cada día: `asistio` · `retardo` · `falta` · `justificado` · `descanso` · `festivoOficial` · `festivoOficialTrabajado` · `festivoPropio` · `festivoPropioTrabajado`.\n\n`tipoFestivo`: `0` ninguno · `1` **oficial** (Art. 74 ⇒ prima del Art. 75) · `2` propio de la empresa.\n\n---\n\n⚠️ Los **ejemplos de respuesta** (200 y 400) viven en el archivo versionado del repo: `docs/postman/RedSmart-Integraciones-RH.postman_collection.json`. El conector de Postman no puede crearlos por API."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"desde\": \"2026-07-01\",\n  \"hasta\": \"2026-07-31\",\n  \"hastaEfectiva\": \"2026-07-31\",\n  \"recortado\": false,\n  \"todoFuturo\": false,\n  \"diasConsolidados\": 31,\n  \"omitidos\": [\n    {\n      \"idRegistro\": 10263,\n      \"motivo\": \"sin_turno_asignado\"\n    }\n  ],\n  \"omitidosDisponible\": true,\n  \"incompletas\": 2,\n  \"incoherentes\": 0,\n  \"conHueco\": 1,\n  \"minutosEnHuecos\": 45,\n  \"total\": 620,\n  \"dias\": [\n    {\n      \"idRegistro\": 10252,\n      \"fecha\": \"2026-07-01\",\n      \"turno\": \"Matutino\",\n      \"centro\": \"Sucursal Guadalajara\",\n      \"horaInicio\": \"09:00\",\n      \"horaFin\": \"18:00\",\n      \"entrada\": \"2026-07-01T09:02:00\",\n      \"salida\": \"2026-07-01T20:05:00\",\n      \"numChecadas\": 2,\n      \"retardoMin\": 2,\n      \"extraMin\": 120,\n      \"extraAprobadaMin\": 60,\n      \"extraEstado\": \"aprobada\",\n      \"extraExcede\": 0,\n      \"trabajadoMin\": 543,\n      \"huecoMin\": 0,\n      \"numHuecos\": 0,\n      \"falta\": false,\n      \"ausenciaLegitima\": false,\n      \"tipoAusencia\": null,\n      \"domingo\": 0,\n      \"tipoFestivo\": 0,\n      \"festivoOficialTrabajado\": false,\n      \"laborable\": true,\n      \"cuentaAsistencia\": true,\n      \"jornadaIncompleta\": false,\n      \"jornadaIncoherente\": false,\n      \"sinEntrada\": false,\n      \"sinSalida\": false,\n      \"estado\": \"retardo\"\n    },\n    {\n      \"idRegistro\": 10270,\n      \"fecha\": \"2026-07-01\",\n      \"turno\": \"Matutino\",\n      \"centro\": \"Sucursal Guadalajara\",\n      \"horaInicio\": \"09:00\",\n      \"horaFin\": \"18:00\",\n      \"entrada\": \"2026-07-01T08:58:00\",\n      \"salida\": \"2026-07-01T19:30:00\",\n      \"numChecadas\": 2,\n      \"retardoMin\": 0,\n      \"extraMin\": 90,\n      \"extraAprobadaMin\": 0,\n      \"extraEstado\": \"na\",\n      \"extraExcede\": 0,\n      \"trabajadoMin\": 540,\n      \"huecoMin\": 0,\n      \"numHuecos\": 0,\n      \"falta\": false,\n      \"ausenciaLegitima\": false,\n      \"tipoAusencia\": null,\n      \"domingo\": 0,\n      \"tipoFestivo\": 0,\n      \"festivoOficialTrabajado\": false,\n      \"laborable\": true,\n      \"cuentaAsistencia\": true,\n      \"jornadaIncompleta\": false,\n      \"jornadaIncoherente\": false,\n      \"sinEntrada\": false,\n      \"sinSalida\": false,\n      \"estado\": \"asistio\"\n    }\n  ]\n}"},{"id":"673370c7-eeb5-29b1-8700-ed0472575be5","name":"400 · el rango pasa de 92 días","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.red-smart.com/api/ext/jornadas?desde=2026-07-01&hasta=2026-07-31","host":["https://api.red-smart.com"],"path":["api","ext","jornadas"],"query":[{"description":"Obligatorio (yyyy-MM-dd).","key":"desde","value":"2026-07-01"},{"description":"Obligatorio (yyyy-MM-dd). Rango máximo 92 días. Si pide días futuros el rango se recorta a hoy: lea `hastaEfectiva`.","key":"hasta","value":"2026-07-31"}]},"description":"**El endpoint de NÓMINA.** Devuelve la jornada YA CALCULADA de cada persona y día: los pares emparejados, la comida descontada, el retardo, y si el día era laborable. **Máximo 92 días** por llamada.\n\n⛔ **No use `api/ext/checadas` para pagar.** Esa es la bitácora cruda, sin emparejar; derivar el pago de ahí es lo que produce dos nóminas distintas del mismo dato.\n\n---\n\n## ⚠️ Horas extra: `extraMin` NO es lo que se paga\n\nEl día trae **tres** campos de extra, y significan cosas distintas:\n\n| Campo | Qué es |\n|---|---|\n| `extraMin` | **Lo MEDIDO** — minutos trabajados por encima del turno. Nadie los autorizó. |\n| `extraAprobadaMin` | **Lo AUTORIZADO** — lo que un responsable aprobó, y quedó sellado. |\n| `extraEstado` | `na` · `pendiente` · `aprobada` · `rechazada` |\n| `extraExcede` | `1` si lo aprobado rebasa el tope de ley (Art. 66 y 68 LFT). Se **marca**, no se bloquea. |\n\n⭐ **Cuál pagar es decisión de la empresa, y el archivo no la toma por usted.** Si su política es pagar sólo lo autorizado, use `extraAprobadaMin`. Si paga lo trabajado, use `extraMin`.\n\n🔴 **`extraAprobadaMin = 0` no quiere decir que no hubo extra.** Quiere decir que **nadie la autorizó** — y con el módulo de autorización apagado, que es el default, sale **cero siempre**. Mire `extraEstado`: `na` es *nadie pidió nada*; `rechazada` es *se pidió y se negó*. No son lo mismo.\n\n---\n\n## ⚠️ El archivo DICE lo que le falta — léalo antes de conciliar\n\n- `omitidos` — personas activas que **no salen en `dias`** porque **nadie les asignó turno**. Sin turno no hay jornada que calcular: es configuración, no ausentismo. ⛔ Si `omitidosDisponible` viene en `false`, ese arreglo vacío **no es un cero medido**: no se pudo leer el roster.\n- `incompletas` — días a los que les falta una marca.\n- `incoherentes` — días cuyo par **no puede ser** (salida anterior a la entrada). En los dos casos `trabajadoMin` viaja vacío, y por eso van **aparte**: no es lo mismo *no trabajó* que *el dato está roto*.\n- `conHueco` / `minutosEnHuecos` — turno partido o regreso a cubrir: horas que el archivo **no cuenta**.\n- `recortado` / `hastaEfectiva` — si pidió días futuros, el rango se recortó a hoy. **`hastaEfectiva` es el límite real de lo que trae**, no `hasta`.\n\n---\n\n`estado` de cada día: `asistio` · `retardo` · `falta` · `justificado` · `descanso` · `festivoOficial` · `festivoOficialTrabajado` · `festivoPropio` · `festivoPropioTrabajado`.\n\n`tipoFestivo`: `0` ninguno · `1` **oficial** (Art. 74 ⇒ prima del Art. 75) · `2` propio de la empresa.\n\n---\n\n⚠️ Los **ejemplos de respuesta** (200 y 400) viven en el archivo versionado del repo: `docs/postman/RedSmart-Integraciones-RH.postman_collection.json`. El conector de Postman no puede crearlos por API."},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"El rango máximo es de 92 días.\"\n}"}],"_postman_id":"1c09c3ce-c9f1-8879-fab4-adbc2998d11f"},{"name":"Checadas (bitácora de marcas)","id":"4e21b9d5-3e8a-4482-90fd-252a27a399ed","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.red-smart.com/api/ext/checadas?desde=2026-07-01&hasta=2026-07-31","description":"<p>Cada marca registrada, cruda, para auditoría. <strong>Máximo 92 días</strong> por llamada.</p>\n<p><code>banderas</code> es un mapa de bits: la checada quedó registrada y la bandera sólo señala qué revisar. Los dos que más importan:</p>\n<ul>\n<li><code>4</code> fuera de turno — checó a deshora</li>\n<li><code>2048</code> sin turno asignado — <strong>problema de configuración, no de la persona</strong></li>\n</ul>\n<p>Una checada con 2048 significa que a esa persona nadie le asignó turno, así que no genera jornada y <strong>no va a aparecer en el resumen de nómina</strong>.</p>\n<p><code>tsEfectiva</code> viene tal cual la registró el reloj, en hora local del centro.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-Api-Key"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7d41d735-1307-4036-beae-f75a4000e7ef","id":"7d41d735-1307-4036-beae-f75a4000e7ef","name":"RedSmart · Integraciones RH","type":"collection"}},"urlObject":{"path":["api","ext","checadas"],"host":["https://api.red-smart.com"],"query":[{"key":"desde","value":"2026-07-01"},{"key":"hasta","value":"2026-07-31"},{"disabled":true,"description":{"content":"<p>Opcional: filtra a un centro de trabajo.</p>\n","type":"text/plain"},"key":"idCentro","value":""}],"variable":[]}},"response":[],"_postman_id":"4e21b9d5-3e8a-4482-90fd-252a27a399ed"}],"id":"8fb67436-da2f-438b-85bb-1906d07281d5","description":"<p>Las marcas del reloj checador, crudas. Para auditoría y para conciliar contra su sistema de asistencia — el resumen que su nómina consume vive en Movimientos.</p>\n","_postman_id":"8fb67436-da2f-438b-85bb-1906d07281d5","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-Api-Key"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7d41d735-1307-4036-beae-f75a4000e7ef","id":"7d41d735-1307-4036-beae-f75a4000e7ef","name":"RedSmart · Integraciones RH","type":"collection"}}},{"name":"Cumplimiento","item":[{"name":"Capacitación (cobertura y DC-3)","id":"26d3a457-6f5e-4ddd-9fc4-b05c53635326","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.red-smart.com/api/ext/capacitacion","description":"<p>Avance por curso y el detalle colaborador × curso. Sostiene la constancia <strong>DC-3</strong> (LFT Art. 153).</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-Api-Key"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7d41d735-1307-4036-beae-f75a4000e7ef","id":"7d41d735-1307-4036-beae-f75a4000e7ef","name":"RedSmart · Integraciones RH","type":"collection"}},"urlObject":{"path":["api","ext","capacitacion"],"host":["https://api.red-smart.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"26d3a457-6f5e-4ddd-9fc4-b05c53635326"},{"name":"Acuses (comunicados, RIT y privacidad)","id":"0bdfab4b-3970-4373-8cae-44e9014f2a47","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.red-smart.com/api/ext/acuses","description":"<p>Quién aceptó qué y cuándo: comunicados oficiales, Reglamento Interior de Trabajo (LFT Art. 422) y aviso de privacidad (LFPDPPP).</p>\n<p>Es la evidencia de que el documento se puso a disposición, que es lo que se pide en una inspección.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-Api-Key"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7d41d735-1307-4036-beae-f75a4000e7ef","id":"7d41d735-1307-4036-beae-f75a4000e7ef","name":"RedSmart · Integraciones RH","type":"collection"}},"urlObject":{"path":["api","ext","acuses"],"host":["https://api.red-smart.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"0bdfab4b-3970-4373-8cae-44e9014f2a47"},{"name":"Descansos (Ley Silla)","id":"4e3accf4-8cd9-4581-9183-d87550b4a871","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.red-smart.com/api/ext/descansos","description":"<p>Políticas vigentes y pausas por centro (LFT Art. 132-V). Sin fechas devuelve sólo las políticas.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-Api-Key"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7d41d735-1307-4036-beae-f75a4000e7ef","id":"7d41d735-1307-4036-beae-f75a4000e7ef","name":"RedSmart · Integraciones RH","type":"collection"}},"urlObject":{"path":["api","ext","descansos"],"host":["https://api.red-smart.com"],"query":[{"disabled":true,"key":"desde","value":"2026-07-01"},{"disabled":true,"key":"hasta","value":"2026-07-31"}],"variable":[]}},"response":[],"_postman_id":"4e3accf4-8cd9-4581-9183-d87550b4a871"},{"name":"NOM-035 (clima laboral)","id":"25967d10-ea88-4dde-b1d0-d0ea5514a781","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.red-smart.com/api/ext/nom035","description":"<p>Aplicaciones de la encuesta y, con <code>idAplicacion</code>, sus resultados.</p>\n<p>⚠️ <strong>Los resultados son AGREGADOS y con k-anonimato ≥ 5</strong>: nunca se devuelven respuestas por persona, ni siquiera con la key del tenant. La NOM-035 exige confidencialidad y por eso el límite es del servidor, no de la pantalla. Un grupo con menos de 5 respuestas no se reporta.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-Api-Key"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7d41d735-1307-4036-beae-f75a4000e7ef","id":"7d41d735-1307-4036-beae-f75a4000e7ef","name":"RedSmart · Integraciones RH","type":"collection"}},"urlObject":{"path":["api","ext","nom035"],"host":["https://api.red-smart.com"],"query":[{"disabled":true,"description":{"content":"<p>Con este parámetro devuelve los resultados AGREGADOS de esa aplicación.</p>\n","type":"text/plain"},"key":"idAplicacion","value":""}],"variable":[]}},"response":[],"_postman_id":"25967d10-ea88-4dde-b1d0-d0ea5514a781"}],"id":"f535b641-8d79-4ff4-ab2c-388a9c4792e6","description":"<p>Lo que la STPS pide poder exhibir.</p>\n","_postman_id":"f535b641-8d79-4ff4-ab2c-388a9c4792e6","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-Api-Key"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7d41d735-1307-4036-beae-f75a4000e7ef","id":"7d41d735-1307-4036-beae-f75a4000e7ef","name":"RedSmart · Integraciones RH","type":"collection"}}},{"name":"Webhooks","item":[{"name":"Receptor de prueba (eco)","id":"a715fdd5-5785-4a1d-938a-b79b672b6b6c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-RedSmart-Event","value":"empleado.baja"},{"key":"X-RedSmart-Timestamp","value":"1785615812"},{"key":"X-RedSmart-Signature","value":"sha256=ejemplo"}],"body":{"mode":"raw","raw":"{\n  \"idRegistro\": 99991131,\n  \"idEmpleado\": \"1184\",\n  \"fechaEfectiva\": \"2026-07-22T00:00:00\",\n  \"fechaIngreso\": \"2024-08-01T00:00:00\",\n  \"motivoClave\": \"renuncia\",\n  \"motivoEtiqueta\": \"Renuncia voluntaria\",\n  \"tipoBaja\": 1,\n  \"fundamento\": \"LFT Art. 53-I\",\n  \"afectaPago\": true\n}"},"url":"https://api.red-smart.com/api/ext/eco-webhook","description":"<p><strong>Apunte aquí su webhook antes de escribir una línea de código.</strong></p>\n<p>Responde 200 y le devuelve lo que llegó, incluido <strong><code>mensajeFirmado</code></strong> ya armado (<code>timestamp + \".\" + cuerpo</code>) — el mismo texto que usted tiene que firmar para comparar.</p>\n<p>Sirve para ver una entrega <strong>exitosa</strong> en la bitácora antes de tener receptor propio: apuntando a una URL inventada sólo vería reintentos fallidos, sin saber si el problema es suyo o nuestro.</p>\n<p>No requiere API key (un webhook manda firma, no key) y no guarda nada.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-Api-Key"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7d41d735-1307-4036-beae-f75a4000e7ef","id":"7d41d735-1307-4036-beae-f75a4000e7ef","name":"RedSmart · Integraciones RH","type":"collection"}},"urlObject":{"path":["api","ext","eco-webhook"],"host":["https://api.red-smart.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"a715fdd5-5785-4a1d-938a-b79b672b6b6c"}],"id":"5dd6a794-8fc4-4f06-aaf1-dd937248ea98","description":"<p>El camino inverso: en vez de que usted consulte, RedSmart le avisa.</p>\n<img src=\"https://content.pstmn.io/a481e55e-b365-4d4a-aa2c-625655b86951/MDQtd2ViaG9vay1mbHVqby5wbmc=\" alt=\"Se%20firma%20timestamp%20+%20&quot;.&quot;%20+%20el%20cuerpo%20CRUDO.%20Firmar%20el%20JSON%20re-serializado%20es%20el%20error%20nº%201.\" />\n\n<h3 id=\"eventos\">Eventos</h3>\n<p><code>empleado.alta</code> · <code>empleado.baja</code> · <code>empleado.suspension</code> · <code>empleado.reanudacion</code> · <code>empleado.movimiento</code> · <code>checada.registrada</code> · <code>curso.completado</code> · <code>comunicado.acuse</code> · <code>rit.acuse</code></p>\n<p>Los de <code>empleado.\\*</code> viajan completos —nº de empleado, fecha efectiva, fecha de ingreso, motivo tipificado con fundamento y <code>afectaPago</code>— para que no tenga que llamarnos de vuelta.</p>\n<h3 id=\"lo-que-recibe\">Lo que recibe</h3>\n<p>Un <code>POST</code> con <code>Content-Type: application/json</code>. <strong>El cuerpo es el payload</strong>; no hay sobre, el tipo va en el header.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>X-RedSmart-Event:     empleado.baja\nX-RedSmart-Delivery:  1043            # úselo para deduplicar\nX-RedSmart-Timestamp: 1785615812      # segundos unix\nX-RedSmart-Signature: sha256=a1b2c3…\n\n</code></pre><h3 id=\"verificar-la-firma--aquí-es-donde-casi-todos-fallan\">Verificar la firma — aquí es donde casi todos fallan</h3>\n<p>Se firma <strong><code>timestamp + \".\" + el cuerpo CRUDO</code></strong> con HMAC-SHA256, en hexadecimal, usando el secreto que se mostró al crear el webhook.</p>\n<p>Firme <strong>los bytes que recibió</strong>: si deserializa el JSON y lo vuelve a serializar, los bytes cambian y la firma nunca coincidirá. Es el error nº 1.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-js\">const mio = 'sha256=' + crypto.createHmac('sha256', SECRETO)\n      .update(ts + '.' + rawBody).digest('hex');\n\n</code></pre>\n<p>Compare en <strong>tiempo constante</strong> (<code>crypto.timingSafeEqual</code>), y rechace lo que tenga más de 5 minutos.</p>\n<h3 id=\"qué-responder\">Qué responder</h3>\n<p>Cualquier <strong>2xx</strong> = entregado. Otra cosa, o no contestar en <strong>10 segundos</strong>, cuenta como fallo y se reintenta a <strong>1 min, 5 min, 30 min, 2 h y 6 h</strong>.</p>\n<p>La entrega es <strong>al-menos-una-vez</strong>: conteste rápido y procese después. Si hace el trabajo antes de responder, un proceso lento se convierte en un duplicado.</p>\n<p>La URL debe ser <strong>HTTPS</strong> y alcanzable desde internet.</p>\n","_postman_id":"5dd6a794-8fc4-4f06-aaf1-dd937248ea98","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-Api-Key"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7d41d735-1307-4036-beae-f75a4000e7ef","id":"7d41d735-1307-4036-beae-f75a4000e7ef","name":"RedSmart · Integraciones RH","type":"collection"}}},{"name":"MCP (asistente de IA)","item":[{"name":"Listar herramientas (tools/list)","id":"a00ab2da-e8a9-4746-808f-d82d46dcc01a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json, text/event-stream"}],"body":{"mode":"raw","raw":"{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/list\",\n  \"params\": {}\n}"},"url":"https://api.red-smart.com/mcp","description":"<p>Comprobación de conectividad: devuelve las 7 herramientas disponibles. Si esto responde, su asistente podrá conectarse.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-Api-Key"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7d41d735-1307-4036-beae-f75a4000e7ef","id":"7d41d735-1307-4036-beae-f75a4000e7ef","name":"RedSmart · Integraciones RH","type":"collection"}},"urlObject":{"path":["mcp"],"host":["https://api.red-smart.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"a00ab2da-e8a9-4746-808f-d82d46dcc01a"}],"id":"1c4a786f-b993-4635-aa8d-c128042f6ebc","description":"<p>El mismo catálogo, para preguntarle en lenguaje natural desde Claude, ChatGPT o Cursor.</p>\n<p><strong>Endpoint:</strong> <code>https://api.red-smart.com/mcp</code> · <strong>Header:</strong> <code>X-Api-Key: rsk_…</code></p>\n<p><strong>7 tools, solo lectura:</strong> <code>get_roster</code> · <code>get_movimientos</code> · <code>get_checadas</code> · <code>get_capacitacion</code> · <code>get_acuses</code> · <code>get_descansos</code> · <code>get_nom035</code></p>\n<p>Desde Claude Code o Cursor:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">claude mcp add --transport http redsmartrh \\\n  \"https://api.red-smart.com/mcp\" \\\n  --header \"X-Api-Key: rsk_xxxxx\"\n</code></pre>\n<p>En ChatGPT o claude.ai agréguelo como conector con esa URL y pegue su API key cuando la pida.</p>\n","_postman_id":"1c4a786f-b993-4635-aa8d-c128042f6ebc","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-Api-Key"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7d41d735-1307-4036-beae-f75a4000e7ef","id":"7d41d735-1307-4036-beae-f75a4000e7ef","name":"RedSmart · Integraciones RH","type":"collection"}}}],"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-Api-Key"},{"key":"value","value":""}]}},"variable":[{"key":"apiHost","value":"https://api.red-smart.com"},{"key":"apiKey","value":""}]}