# Adelantar el reloj de prueba

`POST https://api.fiscalisto.com/v1/issuers/{id}/test_clock/advance`

Mueve el reloj hasta frozen_time haciendo, día por día, lo que habría pasado: timbra las facturas recurrentes de cada periodo, vence las cotizaciones y hace las facturas globales de tickets, con sus eventos. Contesta cuando terminó, con lo que hizo en advanced, y llega test_clock.ready. Hasta 25 comprobantes por solicitud: si se detiene antes, stopped_early y otra llamada sigue. Los CFDI se timbran con la fecha real (el SAT solo acepta la de hoy); el periodo, los vencimientos y los eventos siguen al reloj.

## Parámetros

| Nombre | Dónde | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `id` | ruta | sí | El id del objeto. |
| `Idempotency-Key` | encabezado |  | Opcional (los SDK la mandan solos). Si la respuesta se pierde, repita la solicitud con el mismo valor durante 24 horas: contesta lo mismo, con idempotent-replayed: true, y no lo hace dos veces (ni crea, ni manda correos, ni cobra). |

## Cuerpo

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `frozen_time` | string | sí | A dónde adelantarlo: después de la hora actual del reloj. Lo que toca en el camino se hace día por día. |

Ejemplo:

```json
{
  "frozen_time": "2026-12-01T09:00:00-06:00"
}
```

## Con el SDK de TypeScript

```ts
import { Fiscalisto } from "fiscalisto";

// La llave viene de FISCALISTO_API_KEY.
const fiscalisto = new Fiscalisto();

const testClock = await fiscalisto.testClocks.advance("clk_0q1Vmmw52sbD", { frozen_time: "2026-12-01T09:00:00-06:00" }, { idempotencyKey: "pedido-A-1042" });
```

## Con el SDK de Python

```python
from fiscalisto import Fiscalisto

# La llave viene de FISCALISTO_API_KEY.
fiscalisto = Fiscalisto()

test_clock = fiscalisto.test_clocks.advance("clk_0q1Vmmw52sbD", {"frozen_time": "2026-12-01T09:00:00-06:00"}, idempotency_key="pedido-A-1042")
```

## Con el SDK de PHP

```php
<?php

use Fiscalisto\Fiscalisto;

// La llave viene de FISCALISTO_API_KEY.
$fiscalisto = new Fiscalisto();

$testClock = $fiscalisto->testClocks->advance('clk_0q1Vmmw52sbD', ['frozen_time' => '2026-12-01T09:00:00-06:00'], ['idempotency_key' => 'pedido-A-1042']);
```

## Con el SDK de .NET

```csharp
using Fiscalisto;

// La llave viene de FISCALISTO_API_KEY.
var fiscalisto = new FiscalistoClient();

var testClock = await fiscalisto.TestClocks.AdvanceAsync("clk_0q1Vmmw52sbD", new AdvanceTestClockParams
{
    FrozenTime = "2026-12-01T09:00:00-06:00",
}, new RequestOptions { IdempotencyKey = "pedido-A-1042" });
```

## Con el SDK de Go

```go
package main

import (
	"context"
	"fmt"
	"log"

	fiscalisto "fiscalisto.com/go"
)

func main() {
	// La llave viene de FISCALISTO_API_KEY.
	client, err := fiscalisto.NewClient("")
	if err != nil {
		log.Fatal(err)
	}
	ctx := context.Background()

	testClock, err := client.TestClocks.Advance(ctx, "clk_0q1Vmmw52sbD", &fiscalisto.AdvanceTestClockParams{
		FrozenTime: "2026-12-01T09:00:00-06:00",
	}, fiscalisto.WithIdempotencyKey("pedido-A-1042"))
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(testClock.ID)
}
```

## Con el SDK de Java

```java
import com.fiscalisto.FiscalistoClient;
import com.fiscalisto.RequestOptions;
import com.fiscalisto.model.AdvanceTestClockParams;

// La llave viene de FISCALISTO_API_KEY.
var fiscalisto = new FiscalistoClient();

var testClock = fiscalisto.testClocks().advance("clk_0q1Vmmw52sbD", new AdvanceTestClockParams()
        .setFrozenTime("2026-12-01T09:00:00-06:00"), RequestOptions.idempotencyKey("pedido-A-1042"));
System.out.println(testClock.getId());
```

## Respuesta 200

Correcto.

Un objeto `TestClock`:

| Campo | Tipo | Siempre viene | Descripción |
| --- | --- | --- | --- |
| `id` | string | sí | clk_ y la clave del emisor. |
| `object` | `"test_clock"` | sí | Qué tipo de objeto es («invoice», «customer»…). |
| `livemode` | `false` | sí | true en producción (llaves fk_live_), false en pruebas (fk_test_). Lo de pruebas no vale ante el SAT. |
| `issuer` | string | sí | El emisor de pruebas que vive en esta hora. |
| `frozen_time` | string (date-time) | sí | La hora del reloj: el «hoy» del emisor para sus facturas recurrentes, cotizaciones, cuentas por cobrar y tickets. |
| `status` | `ready`, `advancing` | sí | advancing mientras una solicitud lo adelanta; ready en cualquier otro momento. |
| `created_at` | string (date-time) o null | sí | Cuándo se creó, ISO 8601 con la hora de la Ciudad de México (-06:00). |
| `advanced` | objeto |  | Al adelantarlo: lo que se hizo en el camino. |
| `advanced.recurring_invoices` | integer | sí | Facturas recurrentes timbradas en el camino. (de -9007199254740991 a 9007199254740991) |
| `advanced.quotes_expired` | integer | sí | Cotizaciones que vencieron en el camino. (de -9007199254740991 a 9007199254740991) |
| `advanced.global_invoices` | integer | sí | Facturas globales de tickets timbradas en el camino. (de -9007199254740991 a 9007199254740991) |
| `stopped_early` | boolean |  | true si se detuvo antes de requested_time porque ya timbró 25 comprobantes en esta solicitud: adelántelo otra vez para seguir. |
| `requested_time` | string (date-time) |  | A dónde se pidió adelantarlo (con stopped_early). |
| `deleted` | boolean |  | Siempre true. |

```json
{
  "id": "clk_0q1Vmmw52sbD",
  "object": "test_clock",
  "livemode": false,
  "issuer": "iss_0q1Vmmw52sbD",
  "frozen_time": "2026-12-01T09:00:00-06:00",
  "status": "ready",
  "created_at": "2026-10-25T09:40:00-06:00",
  "advanced": {
    "recurring_invoices": 2,
    "quotes_expired": 1,
    "global_invoices": 1
  }
}
```

## Errores

Puede responder 400, 401, 403, 404, 429, 500 con el cuerpo de error de siempre; cada código está en https://fiscalisto.com/docs/api/errores.md.
