factadesarrolladores API 0.1.0-esqueleto

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.

curlTerminal
curl "https://clock.factadte.com/?t0=$(date +%s)000&id=prueba1"
jsonRespuesta
{
  "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"
}
CampoQué dice
t0Su hora al enviar, devuelta tal cual. Es el entero de milisegundos que usted mandó en ?t0=; si no mandó uno válido, null.
idEl texto corto que usted mandó en ?id=, devuelto igual. Sirve para saber a qué petición responde cada respuesta.
t1La hora de Facta cuando llegó la petición, en milisegundos desde 1970.
t2La hora de Facta justo antes de responder. Normalmente es igual a t1.
serverTimet2 como fecha ISO-8601 en UTC, para leer en un registro.
precisionMsLa resolución del reloj del servidor, en milisegundos.
svt2 en hora de El Salvador (UTC−6 todo el año, sin horario de verano).
nextSyncAfterMsCuánto tiempo conviene confiar en una calibración: 6 horas.
coloEl 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.

tsCompartir el reloj con un destino S3
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: GET y OPTIONS; cualquier otro es 405. Cualquier otra ruta es 404.
  • t0 e id son opcionales. Un t0 que no sea un entero se ignora, nunca da error.
  • Cabeceras: Cache-Control: no-store, Access-Control-Allow-Origin: , Timing-Allow-Origin: y Server-Timing.
  • Sin cookies, sin registro de quien pregunta, sin almacenamiento.

Otras guías

Escriba para buscar Por ejemplo: idempotencia, contingencia, 422, emitir.

↑ ↓ moverse Enter abrir Esc cerrar