# Pedir la opinión de cumplimiento al SAT

`POST https://api.fiscalisto.com/v1/issuers/{id}/compliance_opinion/refresh`

La pide al SAT ahora con la e.firma guardada del emisor (POST /v1/issuers/{id}/efirma con keep_for_downloads: true). 1 timbre en producción, una vez cada 10 minutos; regresa si el SAT no contesta. Si el SAT tarda, contesta status processing y el resultado llega a GET /v1/issuers/{id}/compliance_opinion. En pruebas da una positiva de ejemplo.

## 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). |

## Con el SDK de TypeScript

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

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

const satRefresh = await fiscalisto.issuers.refreshComplianceOpinion("id", { idempotencyKey: "pedido-A-1042" });
```

## Con el SDK de Python

```python
from fiscalisto import Fiscalisto

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

sat_refresh = fiscalisto.issuers.refresh_compliance_opinion("id", 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();

$satRefresh = $fiscalisto->issuers->refreshComplianceOpinion('id', ['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 satRefresh = await fiscalisto.Issuers.RefreshComplianceOpinionAsync("id", 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()

	satRefresh, err := client.Issuers.RefreshComplianceOpinion(ctx, "id", fiscalisto.WithIdempotencyKey("pedido-A-1042"))
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%+v\n", *satRefresh)
}
```

## Con el SDK de Java

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

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

var satRefresh = fiscalisto.issuers().refreshComplianceOpinion("id", RequestOptions.idempotencyKey("pedido-A-1042"));
System.out.println(satRefresh);
```

## Respuesta 200

Correcto.

Un objeto `SatRefresh`:

| Campo | Tipo | Siempre viene | Descripción |
| --- | --- | --- | --- |
| `object` | `"sat_refresh"` | sí | Qué tipo de objeto es («invoice», «customer»…). |
| `livemode` | boolean | 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. |
| `document` | `compliance_opinion`, `tax_status_certificate`, `sat_mailbox` | sí | Qué se consultó. |
| `status` | `completed`, `processing` | sí | completed (ya está en url) o processing (el SAT tarda; llega a url en unos minutos). |
| `refreshed_at` | string (date-time) o null | sí | Cuándo se pidió. |
| `next_refresh_at` | string (date-time) o null | sí | Desde cuándo se puede pedir otra vez. |
| `url` | string | sí | Dónde leer lo que trajo. |

```json
{
  "object": "sat_refresh",
  "livemode": false,
  "issuer": "iss_OufpKqnrvx9p",
  "document": "compliance_opinion",
  "status": "completed",
  "refreshed_at": "2026-10-27T09:12:00-06:00",
  "next_refresh_at": "2026-10-27T09:22:00-06:00",
  "url": "/v1/issuers/iss_OufpKqnrvx9p/compliance_opinion"
}
```

## 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.
