{"openapi":"3.1.0","info":{"title":"API de registrodejornada.mx","version":"1.1.0","description":"Lectura del registro de jornada para sistemas de nómina y otros programas. Solo lectura: no registra ni corrige jornadas.\n\n**Autenticación.** Cada consulta lleva `Authorization: Bearer rdj_live_…`. La llave la crea quien es propietario o administrador de la empresa en el panel, en *Ajustes → Integraciones*, y se muestra una sola vez. Guárdala en tu servidor o en la configuración de tu programa, nunca dentro del código de tu programa ni de una página web.\n\n**Límites.** 60 consultas por minuto y 1,000 al día por llave; los encabezados `RateLimit-Limit`, `RateLimit-Remaining` y `RateLimit-Reset` dicen cuántas quedan. Hasta 92 días por consulta del registro.\n\n**Errores.** Siempre JSON: `{ \"success\": false, \"message\": \"…\", \"code\": \"…\" }`. El mensaje está en español y se puede mostrar tal cual.\n\n**Versión.** La versión 1 solo crece: se pueden agregar campos, formatos y direcciones, nunca cambiar ni quitar los que existen. Cada respuesta dice la versión vigente en el encabezado `X-API-Version`. Lee los campos por su nombre e ignora los que no conozcas, también en el DBF: así una versión nueva nunca rompe tu importación. Los campos del DBF del registro no cambian dentro de la versión 1.\n\nProbar una consulta desde esta página usa tu llave real y cuenta para tus límites; las consultas al registro quedan en el historial de archivos de tu empresa.\n\n**Cambios.**\n- 1.1.0 (24 de octubre de 2026): `GET /companies/{companyId}/prenomina`, la prenómina de un periodo en JSON, XML, DBF, CSV o PDF. `nss` y `hireDate` en el personal.\n- 1.0.0 (23 de octubre de 2026): primera versión."},"servers":[{"url":"https://registrodejornada.mx/api/v1"}],"tags":[{"name":"Empresa","description":"Las empresas a las que llega la llave, sus centros de trabajo y su personal."},{"name":"Registro","description":"Las jornadas de un periodo, en JSON, XML, DBF, CSV o PDF."},{"name":"Prenómina","description":"Lo que la nómina necesita de un periodo, por persona: días, faltas, retardos, horas extra, vacaciones, incapacidades y permisos. Cantidades, nunca importes."}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"La llave creada en el panel, en Integraciones: `rdj_live_…`"}},"schemas":{"ApiCompany":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string","description":"Razón social, o el nombre comercial mientras falte"},"tradeName":{"type":"string","description":"Nombre comercial"},"rfc":{"type":["string","null"]}},"required":["id","name","tradeName","rfc"],"example":{"id":"3f6b2c1e-8d4a-4b7e-9c2f-5a1d0e7b6c48","name":"Panadería López SA de CV","tradeName":"Panadería López","rfc":"PLO010101AB1"}},"Error":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"message":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}},"required":["path","message"]}}},"required":["success","message"]},"ApiWorkplace":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"timeZone":{"type":"string","description":"Zona horaria IANA: las fechas del registro son días en esta zona"},"active":{"type":"boolean"}},"required":["id","name","timeZone","active"],"example":{"id":"9a2e4c71-0b3d-4f5e-8a6b-7c9d1e2f3a4b","name":"Matriz","timeZone":"America/Mexico_City","active":true}},"ApiEmployee":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"employeeNumber":{"type":"string","description":"El número de empleado de la empresa, para relacionarlo con tu sistema"},"firstNames":{"type":"string"},"lastNames":{"type":"string"},"curp":{"type":["string","null"]},"nss":{"type":["string","null"],"description":"Número de Seguridad Social del IMSS, 11 dígitos; nulo si la empresa no lo ha capturado"},"hireDate":{"type":["string","null"],"description":"Fecha de ingreso (AAAA-MM-DD); nula si la empresa no la ha capturado"},"workplaceId":{"type":"string","format":"uuid"},"active":{"type":"boolean","description":"Falso cuando ya no trabaja en la empresa; sus jornadas siguen en el registro"}},"required":["id","employeeNumber","firstNames","lastNames","curp","nss","hireDate","workplaceId","active"],"example":{"id":"6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f","employeeNumber":"014","firstNames":"Begoña","lastNames":"Núñez Peña","curp":"NUPB900101MDFXXX01","nss":"92988084494","hireDate":"2024-03-01","workplaceId":"9a2e4c71-0b3d-4f5e-8a6b-7c9d1e2f3a4b","active":true}},"ApiRecords":{"type":"object","properties":{"version":{"type":"number","enum":[1]},"generado":{"type":"string","example":"2026-11-16T15:04:05.000Z"},"verificacion":{"type":"string","description":"La página pública donde se comprueba este archivo","example":"https://registrodejornada.mx/verificar/…"},"empresa":{"type":"object","properties":{"razonSocial":{"type":"string"},"rfc":{"type":"string"}},"required":["razonSocial","rfc"]},"periodo":{"type":"object","properties":{"desde":{"type":"string"},"hasta":{"type":"string"}},"required":["desde","hasta"]},"personas":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"numeroEmpleado":{"type":"string"},"apellidos":{"type":"string"},"nombres":{"type":"string"},"curp":{"type":["string","null"]},"centroDeTrabajo":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"nombre":{"type":"string"},"zonaHoraria":{"type":"string"}},"required":["id","nombre","zonaHoraria"]},"jornadas":{"type":"array","items":{"type":"object","properties":{"fecha":{"type":"string","description":"Día en que empezó la jornada (AAAA-MM-DD), aunque termine al día siguiente","example":"2026-11-03"},"entrada":{"type":"string","description":"ISO 8601 con el desfase de la zona del centro de trabajo","example":"2026-11-03T08:58:00-06:00"},"salida":{"type":["string","null"],"description":"Nulo mientras no hay salida","example":"2026-11-03T17:31:00-06:00"},"minutosDescanso":{"type":"integer","example":30},"minutosTrabajados":{"type":"integer","example":483},"estado":{"type":"string","enum":["completa","en_curso","sin_salida"],"description":"`en_curso`: todavía no registra su salida. `sin_salida`: se quedó sin salida registrada."},"corregida":{"type":"boolean","description":"Alguna corrección cambió esta jornada; el detalle está en `correcciones` de la persona","example":false}},"required":["fecha","entrada","salida","minutosDescanso","minutosTrabajados","estado","corregida"]},"description":"Vacío cuando la persona no tuvo jornadas en el periodo"},"correcciones":{"type":"array","items":{"$ref":"#/components/schemas/ApiCorrection"},"description":"Cada cambio a su registro en el periodo, en el orden en que se hizo. Nada se borra: la marca original sigue en el registro."}},"required":["id","numeroEmpleado","apellidos","nombres","curp","centroDeTrabajo","jornadas","correcciones"]}}},"required":["version","generado","verificacion","empresa","periodo","personas"]},"ApiCorrection":{"type":"object","properties":{"fecha":{"type":"string","description":"Día de la marca que cambió (AAAA-MM-DD)","example":"2026-11-03"},"tipo":{"type":"string","enum":["agregado","hora_corregida","anulado"],"description":"`agregado`: una marca que faltaba. `hora_corregida`: cambió la hora. `anulado`: la marca deja de contar."},"marca":{"type":"string","enum":["inicio_jornada","fin_jornada","inicio_descanso","fin_descanso"]},"horaOriginal":{"type":["string","null"],"description":"Cómo estaba (ISO 8601); nulo cuando la marca se agregó","example":"2026-11-03T09:00:00-06:00"},"horaNueva":{"type":["string","null"],"description":"Cómo quedó (ISO 8601); nulo cuando la marca se anuló","example":"2026-11-03T08:45:00-06:00"},"motivo":{"type":"string","example":"Llegó a las 8:45; el checador no tenía luz"},"autor":{"type":"string","description":"Quien hizo el cambio, o quien aprobó la solicitud de la persona","example":"Laura Gómez Ruiz"},"solicitadaPorLaPersona":{"type":"boolean","description":"La pidió la propia persona desde su enlace y `autor` la aprobó; el motivo es el suyo"},"hechaEl":{"type":"string","description":"Cuándo se hizo el cambio (ISO 8601)","example":"2026-11-04T10:12:31-06:00"}},"required":["fecha","tipo","marca","horaOriginal","horaNueva","motivo","autor","solicitadaPorLaPersona","hechaEl"]},"ApiPrenomina":{"type":"object","properties":{"version":{"type":"number","enum":[1]},"generado":{"type":"string"},"verificacion":{"type":"string"},"empresa":{"type":"object","properties":{"razonSocial":{"type":"string"},"rfc":{"type":"string"}},"required":["razonSocial","rfc"]},"periodo":{"type":"object","properties":{"desde":{"type":"string"},"hasta":{"type":"string"}},"required":["desde","hasta"]},"personas":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"numeroEmpleado":{"type":"string"},"apellidos":{"type":"string"},"nombres":{"type":"string"},"curp":{"type":["string","null"]},"nss":{"type":["string","null"]},"fechaIngreso":{"type":["string","null"]},"centroDeTrabajo":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"nombre":{"type":"string"}},"required":["id","nombre"]},"totales":{"type":"object","properties":{"diasTrabajados":{"type":"integer"},"diasSinRegistro":{"type":"integer","description":"Días que le tocaba trabajar sin registro ni ausencia: la empresa aún no dice qué pasó. No son faltas."},"faltas":{"type":"integer","description":"Solo las que la empresa confirmó"},"retardos":{"type":"integer"},"minutosRetardo":{"type":"integer"},"salidasAnticipadas":{"type":"integer"},"minutosSalidaAnticipada":{"type":"integer"},"minutosExtraDobles":{"type":"integer","description":"Se pagan al doble (art. 67 LFT)"},"minutosExtraTriples":{"type":"integer","description":"Se pagan al triple (art. 68 LFT)"},"minutosExtraExcedente":{"type":"integer","description":"Por encima del límite legal"},"domingosTrabajados":{"type":"integer"},"descansosTrabajados":{"type":"integer"},"festivosTrabajados":{"type":"integer","description":"Festivos de ley (art. 74) trabajados"},"diasVacaciones":{"type":"integer","description":"Días laborables"},"permisosConGoce":{"type":"integer","description":"Días completos de permiso con goce de sueldo"},"permisosSinGoce":{"type":"integer","description":"Días completos de permiso sin goce de sueldo"},"minutosPermisoConGoce":{"type":"integer","description":"Permisos por horas con goce, minutos dentro del horario"},"minutosPermisoSinGoce":{"type":"integer","description":"Permisos por horas sin goce, minutos dentro del horario"}},"required":["diasTrabajados","diasSinRegistro","faltas","retardos","minutosRetardo","salidasAnticipadas","minutosSalidaAnticipada","minutosExtraDobles","minutosExtraTriples","minutosExtraExcedente","domingosTrabajados","descansosTrabajados","festivosTrabajados","diasVacaciones","permisosConGoce","permisosSinGoce","minutosPermisoConGoce","minutosPermisoSinGoce"]},"saldoVacaciones":{"type":["object","null"],"properties":{"aniosServicio":{"type":"integer"},"diasAnio":{"type":"integer","description":"Días del año de servicios en curso (art. 76)"},"disfrutados":{"type":"integer"},"programados":{"type":"integer","description":"Acordados para después del periodo"},"porDisfrutar":{"type":"integer"},"pendientesAnteriores":{"type":"integer","description":"De años anteriores, aún no prescritos"},"fechaLimite":{"type":["string","null"],"description":"Para disfrutar los del año en curso (art. 81: seis meses después del aniversario)"},"saldoInicialCapturado":{"type":"boolean","description":"Falso mientras la empresa no captura lo que le quedaba al darla de alta: los años anteriores pueden no estar al día"}},"required":["aniosServicio","diasAnio","disfrutados","programados","porDisfrutar","pendientesAnteriores","fechaLimite","saldoInicialCapturado"],"description":"Las vacaciones al último día del periodo. Nulo si la empresa no ha capturado la fecha de ingreso."},"incapacidades":{"type":"array","items":{"type":"object","properties":{"tipo":{"type":"string","enum":["01","02","03","04"]},"dias":{"type":"integer"}},"required":["tipo","dias"]},"description":"Días naturales por tipo del catálogo c_TipoIncapacidad del SAT"},"dias":{"type":"array","items":{"type":"object","properties":{"fecha":{"type":"string"},"estado":{"type":"string","enum":["trabajado","ausencia","festivo","descanso","sin_registro","sin_horario","por_venir","fuera_de_registro"]},"minutosTrabajados":{"type":"integer"},"minutosRetardo":{"type":"integer"},"minutosSalidaAnticipada":{"type":"integer"},"minutosExtraDobles":{"type":"integer"},"minutosExtraTriples":{"type":"integer"},"minutosExtraExcedente":{"type":"integer"},"ausencia":{"type":["string","null"],"enum":["falta","vacaciones","incapacidad","permiso_con_goce","permiso_sin_goce",null]},"tipoIncapacidad":{"type":["string","null"],"enum":["01","02","03","04",null]},"festivo":{"type":["object","null"],"properties":{"nombre":{"type":"string"},"oficial":{"type":"boolean"}},"required":["nombre","oficial"]},"permisos":{"type":"array","items":{"type":"object","properties":{"desde":{"type":"string"},"hasta":{"type":"string"},"conGoce":{"type":"boolean"},"minutos":{"type":"integer"}},"required":["desde","hasta","conGoce","minutos"]},"description":"Permisos por horas ese día (HH:MM, hora del centro de trabajo). Llegar o salir dentro de uno no es retardo ni salida anticipada. `minutos`: la parte dentro del horario."}},"required":["fecha","estado","minutosTrabajados","minutosRetardo","minutosSalidaAnticipada","minutosExtraDobles","minutosExtraTriples","minutosExtraExcedente","ausencia","tipoIncapacidad","festivo","permisos"]}}},"required":["id","numeroEmpleado","apellidos","nombres","curp","nss","fechaIngreso","centroDeTrabajo","totales","saldoVacaciones","incapacidades","dias"]}}},"required":["version","generado","verificacion","empresa","periodo","personas"]},"ApiCorrections":{"type":"object","properties":{"version":{"type":"number","enum":[1]},"generado":{"type":"string"},"verificacion":{"type":"string"},"empresa":{"type":"object","properties":{"razonSocial":{"type":"string"},"rfc":{"type":"string"}},"required":["razonSocial","rfc"]},"periodo":{"type":"object","properties":{"desde":{"type":"string"},"hasta":{"type":"string"}},"required":["desde","hasta"]},"personas":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"numeroEmpleado":{"type":"string"},"apellidos":{"type":"string"},"nombres":{"type":"string"},"curp":{"type":["string","null"]},"centroDeTrabajo":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"nombre":{"type":"string"},"zonaHoraria":{"type":"string"}},"required":["id","nombre","zonaHoraria"]},"correcciones":{"type":"array","items":{"$ref":"#/components/schemas/ApiCorrection"},"description":"Vacío cuando nadie cambió su registro en el periodo"}},"required":["id","numeroEmpleado","apellidos","nombres","curp","centroDeTrabajo","correcciones"]}}},"required":["version","generado","verificacion","empresa","periodo","personas"]}},"parameters":{}},"paths":{"/companies":{"get":{"tags":["Empresa"],"summary":"Empresas","description":"Las empresas a las que llega la llave. Sirve también para probar que la llave funciona.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Las empresas","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"message":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiCompany"}}},"required":["success","message","data"]}}}},"401":{"description":"Falta la llave, no existe o fue revocada (`UNAUTHORIZED`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Demasiadas consultas (`RATE_LIMITED`): espera lo que diga `Retry-After`, en segundos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/companies/{companyId}/workplaces":{"get":{"tags":["Empresa"],"summary":"Centros de trabajo","description":"Los centros de trabajo de la empresa, del más antiguo al más reciente.","security":[{"apiKey":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","example":"3f6b2c1e-8d4a-4b7e-9c2f-5a1d0e7b6c48"},"required":true,"name":"companyId","in":"path","description":"El ID de la empresa: lo devuelve `GET /companies`."}],"responses":{"200":{"description":"Los centros de trabajo","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"message":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiWorkplace"}}},"required":["success","message","data"]}}}},"401":{"description":"Falta la llave, no existe o fue revocada (`UNAUTHORIZED`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"La llave no tiene acceso a esa empresa (`FORBIDDEN`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Demasiadas consultas (`RATE_LIMITED`): espera lo que diga `Retry-After`, en segundos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/companies/{companyId}/employees":{"get":{"tags":["Empresa"],"summary":"Personal","description":"El personal de la empresa, por número de empleado, también quien ya no está activo. Sirve para relacionar a cada persona con la de tu sistema (por número de empleado o CURP).","security":[{"apiKey":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","example":"3f6b2c1e-8d4a-4b7e-9c2f-5a1d0e7b6c48"},"required":true,"name":"companyId","in":"path","description":"El ID de la empresa: lo devuelve `GET /companies`."}],"responses":{"200":{"description":"El personal","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"message":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiEmployee"}}},"required":["success","message","data"]}}}},"401":{"description":"Falta la llave, no existe o fue revocada (`UNAUTHORIZED`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"La llave no tiene acceso a esa empresa (`FORBIDDEN`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Demasiadas consultas (`RATE_LIMITED`): espera lo que diga `Retry-After`, en segundos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/companies/{companyId}/records":{"get":{"tags":["Registro"],"summary":"Registro de un periodo","description":"Responde con el archivo mismo, una entrada por jornada, en el formato que pidas (JSON por omisión). A diferencia de las demás direcciones, la respuesta no va dentro de `{ success, data }`.\n\nCada consulta queda registrada como una exportación, igual que las del panel: `X-Verification-Url` es la página pública donde se comprueba el archivo y `X-Content-SHA256` la huella de sus bytes. Guarda ambos al importar.\n\n- **json**: UTF-8, la estructura de abajo. Cada jornada dice si una corrección la cambió (`corregida`), y cada persona trae sus `correcciones`: cómo estaba, cómo quedó, quién y por qué.\n- **xml**: UTF-8, las mismas partes que el JSON.\n- **dbf**: dBase III en Windows-1252, una fila por jornada (NUM_EMP, APELLIDOS, NOMBRES, CURP, CENTRO, ZONA_HOR, FECHA, ENTRADA, F_SALIDA, SALIDA, MIN_DESC, MIN_TRAB, ESTADO).\n- **csv**: UTF-8, una fila por jornada, para hojas de cálculo.\n- **pdf**: el documento para entregar a la autoridad.","security":[{"apiKey":[]}],"x-codeSamples":[{"lang":"bat","label":"Windows (.bat)","source":"@echo off\nrem descargar.bat 2026-11-01 2026-11-15\nrem La llave va en una variable de entorno: setx RDJ_API_KEY \"rdj_live_…\"\nset EMPRESA=TU_ID_DE_EMPRESA\ncurl --fail -s -H \"Authorization: Bearer %RDJ_API_KEY%\" -o asistencia.dbf ^\n  \"https://registrodejornada.mx/api/v1/companies/%EMPRESA%/records?from=%1&to=%2&format=dbf\"\nif errorlevel 1 echo No se pudo descargar el registro"},{"lang":"foxpro","label":"Visual FoxPro","source":"LOCAL loHttp, lcUrl\nlcUrl = \"https://registrodejornada.mx/api/v1/companies/\" + lcEmpresa + \"/records?from=2026-11-01&to=2026-11-15&format=dbf\"\nloHttp = CREATEOBJECT(\"WinHttp.WinHttpRequest.5.1\")\nloHttp.Open(\"GET\", lcUrl, .F.)\nloHttp.SetRequestHeader(\"Authorization\", \"Bearer \" + GETENV(\"RDJ_API_KEY\"))\nloHttp.Send()\nIF loHttp.Status = 200\n   STRTOFILE(loHttp.ResponseBody, \"asistencia.dbf\")\n   lcHuella = loHttp.GetResponseHeader(\"X-Content-SHA256\")\n   lcVerificacion = loHttp.GetResponseHeader(\"X-Verification-Url\")\nELSE\n   MESSAGEBOX(loHttp.ResponseText)\nENDIF"}],"parameters":[{"schema":{"type":"string","format":"uuid","example":"3f6b2c1e-8d4a-4b7e-9c2f-5a1d0e7b6c48"},"required":true,"name":"companyId","in":"path","description":"El ID de la empresa: lo devuelve `GET /companies`."},{"schema":{"type":"string","example":"2026-11-01","description":"Primer día del periodo (AAAA-MM-DD)"},"required":true,"description":"Primer día del periodo (AAAA-MM-DD)","name":"from","in":"query"},{"schema":{"type":"string","example":"2026-11-15","description":"Último día del periodo, incluido. Hasta 92 días después de `from`."},"required":true,"description":"Último día del periodo, incluido. Hasta 92 días después de `from`.","name":"to","in":"query"},{"schema":{"type":"string","enum":["pdf","csv","dbf","xml","json"],"default":"json","description":"Formato del archivo"},"required":false,"description":"Formato del archivo","name":"format","in":"query"},{"schema":{"type":"string","format":"uuid","description":"Solo el personal de ese centro de trabajo"},"required":false,"description":"Solo el personal de ese centro de trabajo","name":"workplaceId","in":"query"},{"schema":{"type":"string","format":"uuid","description":"Solo esa persona"},"required":false,"description":"Solo esa persona","name":"employeeId","in":"query"}],"responses":{"200":{"description":"El archivo","headers":{"X-Verification-Url":{"description":"Página pública donde se comprueba el archivo","schema":{"type":"string"}},"X-Content-SHA256":{"description":"Huella SHA-256 de los bytes del archivo, en hexadecimal","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiRecords"}},"application/xml":{"schema":{"type":"string"}},"application/x-dbf":{"schema":{"type":"string","format":"binary"}},"text/csv":{"schema":{"type":"string"}},"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Falta la llave, no existe o fue revocada (`UNAUTHORIZED`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"La llave no tiene acceso a esa empresa (`FORBIDDEN`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"La empresa todavía no captura su razón social y RFC (`EMPLOYER_DATA_MISSING`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Fechas o formato no válidos, un periodo de más de 92 días, o nadie coincide con la selección","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Demasiadas consultas (`RATE_LIMITED`): espera lo que diga `Retry-After`, en segundos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/companies/{companyId}/prenomina":{"get":{"tags":["Prenómina"],"summary":"Prenómina de un periodo","description":"Responde con el archivo mismo: por persona, los totales del periodo y, en JSON y XML, cada día con su estado. Mismos parámetros, formatos y encabezados que el registro (`X-Verification-Url`, `X-Content-SHA256`); cada consulta queda registrada como una exportación.\n\nLas horas extra se cuentan por semana y se asignan a los días en que se trabajaron, así que un periodo que corta una semana toma solo su parte. Un día sin registro ni ausencia es `sin_registro`, nunca falta: las faltas son solo las que la empresa confirmó. Las incapacidades cuentan días naturales; vacaciones, permisos y faltas, días laborables.\n\n- **json** y **xml**: totales, incapacidades por tipo del SAT y cada día del periodo.\n- **dbf**: dBase III en Windows-1252, un registro por persona (NUM_EMP, APELLIDOS, NOMBRES, CURP, NSS, F_INGRESO, CENTRO, DESDE, HASTA, DIAS_TRAB, SIN_REG, FALTAS, RETARDOS, MIN_RETAR, SAL_ANTIC, MIN_SALANT, MIN_HEDOB, MIN_HETRI, MIN_HEEXC, DOMINGOS, DESC_TRAB, FEST_TRAB, VACACIONES, INC_RT, INC_EG, INC_MAT, INC_CUID, PERM_CGOCE, PERM_SGOCE, MIN_PCGOCE, MIN_PSGOCE, VAC_ANIO, VAC_DISP, VAC_ANT, VAC_LIMITE). Horas extra y permisos por horas en minutos; las vacaciones, al último día del periodo.\n- **csv**: un renglón por persona, para hojas de cálculo.\n- **pdf**: la tabla del periodo y el detalle por persona.","security":[{"apiKey":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","example":"3f6b2c1e-8d4a-4b7e-9c2f-5a1d0e7b6c48"},"required":true,"name":"companyId","in":"path","description":"El ID de la empresa: lo devuelve `GET /companies`."},{"schema":{"type":"string","example":"2026-11-01","description":"Primer día del periodo (AAAA-MM-DD)"},"required":true,"description":"Primer día del periodo (AAAA-MM-DD)","name":"from","in":"query"},{"schema":{"type":"string","example":"2026-11-15","description":"Último día del periodo, incluido. Hasta 92 días después de `from`."},"required":true,"description":"Último día del periodo, incluido. Hasta 92 días después de `from`.","name":"to","in":"query"},{"schema":{"type":"string","enum":["pdf","csv","dbf","xml","json"],"default":"json","description":"Formato del archivo"},"required":false,"description":"Formato del archivo","name":"format","in":"query"},{"schema":{"type":"string","format":"uuid","description":"Solo el personal de ese centro de trabajo"},"required":false,"description":"Solo el personal de ese centro de trabajo","name":"workplaceId","in":"query"},{"schema":{"type":"string","format":"uuid","description":"Solo esa persona"},"required":false,"description":"Solo esa persona","name":"employeeId","in":"query"}],"responses":{"200":{"description":"El archivo","headers":{"X-Verification-Url":{"description":"Página pública donde se comprueba el archivo","schema":{"type":"string"}},"X-Content-SHA256":{"description":"Huella SHA-256 de los bytes del archivo, en hexadecimal","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiPrenomina"}},"application/xml":{"schema":{"type":"string"}},"application/x-dbf":{"schema":{"type":"string","format":"binary"}},"text/csv":{"schema":{"type":"string"}},"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Falta la llave, no existe o fue revocada (`UNAUTHORIZED`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"La llave no tiene acceso a esa empresa (`FORBIDDEN`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"La empresa todavía no captura su razón social y RFC (`EMPLOYER_DATA_MISSING`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Fechas o formato no válidos, un periodo de más de 92 días, o nadie coincide con la selección","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Demasiadas consultas (`RATE_LIMITED`): espera lo que diga `Retry-After`, en segundos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/companies/{companyId}/corrections":{"get":{"tags":["Registro"],"summary":"Correcciones de un periodo","description":"Responde con el archivo mismo: cada cambio al registro en el periodo, por persona. Cómo estaba la marca, cómo quedó, quién hizo el cambio (o aprobó la solicitud de la persona), cuándo y por qué. Nada se borra: la marca original sigue en el registro, y en el PDF aparece tachada junto a la nueva.\n\nMismos parámetros y encabezados que el registro (`X-Verification-Url`, `X-Content-SHA256`); cada consulta queda registrada como una exportación. El JSON y el XML del registro ya traen estas correcciones por persona: esta dirección sirve sobre todo para el DBF, que tiene un registro por jornada y no tiene dónde ponerlas.\n\n- **json** y **xml**: por persona, sus correcciones.\n- **dbf**: dBase III en Windows-1252, un registro por corrección (NUM_EMP, APELLIDOS, NOMBRES, CURP, CENTRO, FECHA, TIPO, MARCA, F_ORIG, H_ORIG, F_NUEVA, H_NUEVA, MOTIVO, AUTOR, SOLICITADA, F_CAMBIO, H_CAMBIO). Fechas y horas en la zona del centro de trabajo.\n- **csv**: un renglón por corrección, para hojas de cálculo.","security":[{"apiKey":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","example":"3f6b2c1e-8d4a-4b7e-9c2f-5a1d0e7b6c48"},"required":true,"name":"companyId","in":"path","description":"El ID de la empresa: lo devuelve `GET /companies`."},{"schema":{"type":"string","example":"2026-11-01","description":"Primer día del periodo (AAAA-MM-DD)"},"required":true,"description":"Primer día del periodo (AAAA-MM-DD)","name":"from","in":"query"},{"schema":{"type":"string","example":"2026-11-15","description":"Último día del periodo, incluido. Hasta 92 días después de `from`."},"required":true,"description":"Último día del periodo, incluido. Hasta 92 días después de `from`.","name":"to","in":"query"},{"schema":{"type":"string","enum":["json","xml","dbf","csv"],"default":"json","description":"Formato del archivo"},"required":false,"description":"Formato del archivo","name":"format","in":"query"},{"schema":{"type":"string","format":"uuid","description":"Solo el personal de ese centro de trabajo"},"required":false,"description":"Solo el personal de ese centro de trabajo","name":"workplaceId","in":"query"},{"schema":{"type":"string","format":"uuid","description":"Solo esa persona"},"required":false,"description":"Solo esa persona","name":"employeeId","in":"query"}],"responses":{"200":{"description":"El archivo","headers":{"X-Verification-Url":{"description":"Página pública donde se comprueba el archivo","schema":{"type":"string"}},"X-Content-SHA256":{"description":"Huella SHA-256 de los bytes del archivo, en hexadecimal","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiCorrections"}},"application/xml":{"schema":{"type":"string"}},"application/x-dbf":{"schema":{"type":"string","format":"binary"}},"text/csv":{"schema":{"type":"string"}}}},"401":{"description":"Falta la llave, no existe o fue revocada (`UNAUTHORIZED`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"La llave no tiene acceso a esa empresa (`FORBIDDEN`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"La empresa todavía no captura su razón social y RFC (`EMPLOYER_DATA_MISSING`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Fechas o formato no válidos (no hay PDF), un periodo de más de 92 días, o nadie coincide con la selección","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Demasiadas consultas (`RATE_LIMITED`): espera lo que diga `Retry-After`, en segundos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"webhooks":{}}