POST /api/v1/sat/opinion-cumplimiento-validar-pdf Pronto

Validar PDF de opinión

Recibe un PDF de opinión de cumplimiento y valida su firma y autenticidad ante el SAT.

1 credito API Key

Parametros

Headers requeridos: Authorization: Bearer <SAT_API_KEY> y Content-Type: application/json.

ParametroTipoLugarRequeridoDescripcionEjemplo
pdf_base64 string body requerido Contenido del PDF codificado en base64. -

Respuesta exitosa

Status 200 - PDF validado.

200 application/json
{
    "cfdi_codigo": 1,
    "data": {
        "valido": true,
        "rfc": "XAXX010101000",
        "fecha_emision": "2026-07-15"
    }
}

Posibles errores

El API siempre retorna JSON con cfdi_codigo indicando el tipo de error.

HTTPCodigo APIDescripcion
4021004Saldo insuficiente
4002002PDF inválido

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/opinion-cumplimiento-validar-pdf" \
  -H "Authorization: Bearer $API_KEY"
🐍 Python
import os
import requests

API_KEY = os.environ.get("SAT_API_KEY", "sat_xxxxxxxxxxxx")
URL = f"https://api.cfdi4.com/api/v1/sat/opinion-cumplimiento-validar-pdf"

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json",
}
body = {}

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/opinion-cumplimiento-validar-pdf`;

const headers = {
  Authorization: "Bearer " + API_KEY,
  "Content-Type": "application/json",
};
const body = {};

const resp = await fetch(url, {
  method: "POST",
  headers,
  body: undefined,
});
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/opinion-cumplimiento-validar-pdf';

// 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 = [];
// Tambien puedes usar el body como JSON literal si lo prefieres:
// $body_json = '{}';

$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/opinion-cumplimiento-validar-pdf"
    body := nil

    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/opinion-cumplimiento-validar-pdf";
        // Body como JSON literal (compatible con cualquier cliente HTTP).
        String bodyJson = "{}";

        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/opinion-cumplimiento-validar-pdf";
        var bodyJson = "{}";

        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.

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/opinion-cumplimiento-validar-pdf" \
  -H "Authorization: Bearer $API_KEY"