La hora de referencia
GET https://clock.factadte.com/ devuelve la hora de Facta. No necesita llave ni cuenta, no guarda nada de quien pregunta y no forma parte de la API: es una ayuda pública para que un reloj local se corrija a sí mismo.
La fecha y la hora de un DTE las pone siempre el servidor de Facta. Esta ayuda no cambia ese documento. Sirve para lo que ocurre en su equipo: firmar una subida a un almacenamiento compatible con S3, que rechaza una firma con más de 15 minutos de diferencia (RequestTimeTooSkewed), y sellar con una hora fiable los registros de su archivo local.
curl "https://clock.factadte.com/?t0=$(date +%s)000&id=prueba1"{
"v": 1,
"id": "prueba1",
"t0": 1791210839950,
"t1": 1791210840123,
"t2": 1791210840124,
"serverTime": "2026-10-05T14:34:00.124Z",
"precisionMs": 1,
"sv": { "date": "2026-10-05", "time": "08:34:00", "utcOffset": "-06:00" },
"nextSyncAfterMs": 21600000,
"colo": "SJO"
}| Campo | Qué dice |
|---|---|
t0 | Su hora al enviar, devuelta tal cual. Es el entero de milisegundos que usted mandó en ?t0=; si no mandó uno válido, null. |
id | El texto corto que usted mandó en ?id=, devuelto igual. Sirve para saber a qué petición responde cada respuesta. |
t1 | La hora de Facta cuando llegó la petición, en milisegundos desde 1970. |
t2 | La hora de Facta justo antes de responder. Normalmente es igual a t1. |
serverTime | t2 como fecha ISO-8601 en UTC, para leer en un registro. |
precisionMs | La resolución del reloj del servidor, en milisegundos. |
sv | t2 en hora de El Salvador (UTC−6 todo el año, sin horario de verano). |
nextSyncAfterMs | Cuánto tiempo conviene confiar en una calibración: 6 horas. |
colo | El centro de datos de Cloudflare que respondió, útil para entender una muestra lenta. |
Cómo se calcula la corrección
Anote su propia hora al recibir la respuesta (t3). Con las cuatro marcas:
- Demora de ida y vuelta:
δ = (t3 − t0) − (t2 − t1). - Desfase:
θ = ((t1 − t0) + (t2 − t3)) / 2. La hora correcta es la de su reloj másθ. - Incertidumbre:
ε = δ / 2 + precisionMs. El desfase es exacto solo si la ida y la vuelta tardaron igual; en el peor caso se equivoca por la mitad de la demora.
Tome tres muestras separadas por unos 300 ms y quédese con la de menor δ, que es la que menos ruido de red tuvo. Descarte una muestra cuyo t0 o id no coincida con lo que envió, o con δ mayor de 3 segundos. Después de calibrar, mida el tiempo con un reloj monotónico y no vuelva a preguntar mientras la incertidumbre se mantenga baja: el SDK vuelve a calibrar cuando pasa de 500 ms, cuando ha transcurrido nextSyncAfterMs o cuando detecta que alguien cambió la hora del equipo.
Lo que el SDK de TypeScript hace por usted
new Facta({ apiKey }) crea un reloj de referencia (clock: true por defecto), lo calibra la primera vez que lo necesita y usa facta.clock.now() para los registros de archivo. createS3ArtifactDestination firma con esa hora y, si S3 contesta RequestTimeTooSkewed, recalibra una vez y reintenta una vez. Si el servicio no responde, usa la hora del equipo y la operación continúa como siempre.
const facta = new Facta({ apiKey: process.env.FACTA_API_KEY! });
const destino = createS3ArtifactDestination({
id: "s3",
label: "Mi bucket",
config: { bucket, region, accessKeyId, secretAccessKey },
clock: facta.clock ?? false,
});Para usar otro punto de calibración pase una URL en clock; para desactivarlo, clock: false.
Forma de la petición y la respuesta
- Métodos:
GETyOPTIONS; cualquier otro es405. Cualquier otra ruta es404. t0eidson opcionales. Unt0que no sea un entero se ignora, nunca da error.- Cabeceras:
Cache-Control: no-store,Access-Control-Allow-Origin:,Timing-Allow-Origin:yServer-Timing. - Sin cookies, sin registro de quien pregunta, sin almacenamiento.
Otras guías
Emitir un DTE
Cómo llamar a POST /v1/dte, qué llega firmado por dentro y las tres respuestas que puede recibir.
Leer →Preparar y firmar por separado
Por qué separar la reserva del correlativo de la firma, el prepareToken y sus 15 minutos, y qué pasa si el documento cambia entre las dos llamadas.
Leer →