POST
/api/v1/sat/descarga-metadata-retencion
Pronto
Solicitar descarga de retenciones
Variante de descarga de metadata enfocada en retenciones.
1 credito
API Key + CIEC
Parametros
Headers requeridos: Authorization: Bearer <SAT_API_KEY> y Content-Type: application/json.
| Parametro | Tipo | Lugar | Requerido | Descripcion | Ejemplo |
|---|---|---|---|---|---|
rfc |
string |
body | requerido | - |
XAXX010101000
|
desde |
date |
body | requerido | - |
2026-01-01
|
hasta |
date |
body | requerido | - |
2026-06-30
|
Respuesta exitosa
Status 200 - Solicitud creada.
200
application/json
{
"cfdi_codigo": 1,
"data": {
"solicitud_id": "SOL-2026-001",
"estado": "EN_PROCESO"
}
}
Posibles errores
El API siempre retorna JSON con cfdi_codigo indicando el tipo de error.
| HTTP | Codigo API | Descripcion |
|---|---|---|
| 402 | 1004 | Saldo insuficiente |
Ejemplos en 7 lenguajes
Copia y adapta el ejemplo. Reemplaza sat_xxxxxxxxxxxx por tu API key.
🔧 cURL
# 1. Autenticación: tu API key (visible solo en este ejemplo).
$API_KEY="sat_xxxxxxxxxxxx"
# 2. Llamada al endpoint.
curl -X POST "https://api.cfdi4.com/api/v1/sat/descarga-metadata-retencion" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"rfc": "XAXX010101000","desde": "2026-01-01","hasta": "2026-06-30"}'
🐍 Python
import os
import requests
API_KEY = os.environ.get("SAT_API_KEY", "sat_xxxxxxxxxxxx")
URL = f"https://api.cfdi4.com/api/v1/sat/descarga-metadata-retencion"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}
body = {
"rfc": "XAXX010101000",
"desde": "2026-01-01",
"hasta": "2026-06-30"
}
resp = requests.post(URL, headers=headers, json=body, timeout=30)
resp.raise_for_status()
data = resp.json()
if data.get("cfdi_codigo") == 1:
print("OK:", data.get("data"))
else:
print("Error:", data.get("cfdi_texto"))
⬢ Node.js
const API_KEY = process.env.SAT_API_KEY || "sat_xxxxxxxxxxxx";
const url = `https://api.cfdi4.com/api/v1/sat/descarga-metadata-retencion`;
const headers = {
Authorization: "Bearer " + API_KEY,
"Content-Type": "application/json",
};
const body = {
"rfc": "XAXX010101000",
"desde": "2026-01-01",
"hasta": "2026-06-30"
};
const resp = await fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
});
const data = await resp.json();
if (data.cfdi_codigo === 1) {
console.log("OK:", data.data);
} else {
console.error("Error:", data.cfdi_texto);
}
🐘 PHP
<?php
$api_key = getenv('SAT_API_KEY') ?: 'sat_xxxxxxxxxxxx';
$url = 'https://api.cfdi4.com/api/v1/sat/descarga-metadata-retencion';
// En una app real, los parametros vienen del request:
// $body = json_decode(file_get_contents('php://input'), true) ?? [];
// Para este ejemplo, hardcodeamos el body de la peticion.
$body = array (
'rfc' => 'XAXX010101000',
'desde' => '2026-01-01',
'hasta' => '2026-06-30',
);
// Tambien puedes usar el body como JSON literal si lo prefieres:
// $body_json = '{"rfc":"XAXX010101000","desde":"2026-01-01","hasta":"2026-06-30"}';
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $api_key,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode($body),
CURLOPT_TIMEOUT => 30,
]);
$resp = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($resp, true);
if (($data['cfdi_codigo'] ?? 0) === 1) {
print_r($data['data']);
} else {
echo 'Error: ' . ($data['cfdi_texto'] ?? 'desconocido') . PHP_EOL;
}
🔵 Go
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
)
func main() {
apiKey := os.Getenv("SAT_API_KEY")
if apiKey == "" {
apiKey = "sat_xxxxxxxxxxxx"
}
url := "https://api.cfdi4.com/api/v1/sat/descarga-metadata-retencion"
body := map[string]interface{}{
"rfc": "XAXX010101000",
"desde": "2026-01-01",
"hasta": "2026-06-30",
}
jsonBody, _ := json.Marshal(body)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonBody))
req.Header.Set("Authorization", "Bearer "+apiKey)
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Println("Error:", err)
return
}
defer resp.Body.Close()
raw, _ := io.ReadAll(resp.Body)
var data map[string]any
json.Unmarshal(raw, &data)
if data["cfdi_codigo"] == float64(1) {
fmt.Println("OK:", data["data"])
} else {
fmt.Println("Error:", data["cfdi_texto"])
}
}
☕ Java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class SatApi {
public static void main(String[] args) throws Exception {
String apiKey = System.getenv().getOrDefault("SAT_API_KEY", "sat_xxxxxxxxxxxx");
String url = "https://api.cfdi4.com/api/v1/sat/descarga-metadata-retencion";
// Body como JSON literal (compatible con cualquier cliente HTTP).
String bodyJson = "{"rfc":"XAXX010101000","desde":"2026-01-01","hasta":"2026-06-30"}";
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(30))
.build();
HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Authorization", "Bearer " + apiKey)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(bodyJson))
.build();
HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println("Status: " + resp.statusCode());
System.out.println(resp.body());
}
}
🟪 C#
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
class SatApi
{
static async Task Main()
{
var apiKey = Environment.GetEnvironmentVariable("SAT_API_KEY") ?? "sat_xxxxxxxxxxxx";
var url = "https://api.cfdi4.com/api/v1/sat/descarga-metadata-retencion";
var bodyJson = "{"rfc":"XAXX010101000","desde":"2026-01-01","hasta":"2026-06-30"}";
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + apiKey);
var content = new StringContent(bodyJson, Encoding.UTF8, "application/json");
var resp = await client.PostAsync(url, content);
var data = await resp.Content.ReadAsStringAsync();
Console.WriteLine($"Status: {resp.StatusCode}");
Console.WriteLine(data);
}
}
Probar este endpoint
Importa la especificacion OpenAPI en tu cliente favorito.
Postman
Importar spec
Insomnia
Importar spec
Bruno
Importar spec
Hoppscotch
Importar spec
OpenAPI
Descargar spec
Ver comando cURL
# 1. Autenticación: tu API key (visible solo en este ejemplo).
$API_KEY="sat_xxxxxxxxxxxx"
# 2. Llamada al endpoint.
curl -X POST "https://api.cfdi4.com/api/v1/sat/descarga-metadata-retencion" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"rfc": "XAXX010101000","desde": "2026-01-01","hasta": "2026-06-30"}'