Servicio operativo · 2.0

API Reference

API REST en espanol para consultar el SAT. Sin captchas, sin quebraderos. Multi-tenancy estricto por RFC, API key por hash Argon2id, 2FA TOTP opcional, cifrado AES-256-GCM para datos sensibles.

Base URL: https://nexus.cfdi4.com 22 endpoints Auth: API Key OpenAPI: /openapi.json

Inicio rapido (3 pasos)

  1. Registrate en /registro y paga el primer mes ($199 MXN).
  2. Genera tu API key en tu panel → API key → "Generar nueva key".
  3. Llama al API con tu key:
    curl -X GET "https://nexus.cfdi4.com/api/consultas/identity?rfc=TU_RFC" \
      -H "Authorization: Bearer pk_live_TU_API_KEY"
0 resultados para

No encontramos nada con ""

Prueba con un termino mas corto, revisa la ortografia o usa el nombre del RFC/endpoint.

Identidad fiscal2

Tu perfil fiscal ante el SAT. Devuelve los datos del RFC asociado a tu API key: identidad, regimen fiscal, domicilio fiscal.

GET
/api/consultas/identidad
Devuelve las opciones de configuracion del proveedor de secretos y de la llave de firma (modalidades disponibles: gestionado por la plataforma o por tu propio vault). Util para saber que modalidad esta habilitada antes de hacer consultas con CIEC/FIEL.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSITu API key.
rfcBody/Querystring (12-13)SIRFC.

Respuestas

200 IdentityResponse · 401 sin auth · 403 RFC no autorizado

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X GET "https://nexus.cfdi4.com/api/consultas/identidad?rfc=ABC010101ABC" \
  -H "Authorization: Bearer $API_KEY"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

params = {
    "rfc": "ABC010101ABC",
}
headers = {"Authorization": f"Bearer {API_KEY}"}
response = requests.get("https://nexus.cfdi4.com/api/consultas/identidad", params=params, headers=headers)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const url = new URL("https://nexus.cfdi4.com/api/consultas/identidad?rfc=ABC010101ABC");
const response = await fetch(url, {
    headers: { "Authorization": `Bearer pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx` },
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/identidad');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPGET => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    u, _ := url.Parse("https://nexus.cfdi4.com/api/consultas/identidad")
    q := u.Query()
    q.Set("rfc", "ABC010101ABC")
    u.RawQuery = q.Encode()
    req, _ := http.NewRequest("GET", u.String(), nil)
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/identidad"))
            .header("Authorization", "Bearer " + apiKey)
            .GET()
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var response = await client.GetAsync("https://nexus.cfdi4.com/api/consultas/identidad");
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "crossTenant": {
      "description": "El cliente usa su propio Azure Key Vault...",
      "consent": { "appClientId": "416cc5b1-...", "adminConsentUrl": "..." }
    },
    "platformManaged": { "description": "..." }
  }
}

Codigos de error

401apiclave_faltanteNo se envio la API key.
403rfc_no_autorizadoRFC no coincide con el de tu API key.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "cliente_no_vinculado_backend",
    "mensaje": "El cliente no esta vinculado con el backend."
  }
}
GET
/api/consultas/datos_fiscales
Devuelve los datos fiscales (RFC, razon social, codigo postal, regimen fiscal, email de facturacion) del usuario autenticado. Util para mostrar la informacion ya registrada sin pedirle al cliente que la capture de nuevo.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSITu API key.
rfcBody/Querystring (12-13)SIRFC.

Respuestas

200 UserFiscalData · 401 sin auth · 403 RFC no autorizado

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X GET "https://nexus.cfdi4.com/api/consultas/datos_fiscales?rfc=ABC010101ABC" \
  -H "Authorization: Bearer $API_KEY"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

params = {
    "rfc": "ABC010101ABC",
}
headers = {"Authorization": f"Bearer {API_KEY}"}
response = requests.get("https://nexus.cfdi4.com/api/consultas/datos_fiscales", params=params, headers=headers)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const url = new URL("https://nexus.cfdi4.com/api/consultas/datos_fiscales?rfc=ABC010101ABC");
const response = await fetch(url, {
    headers: { "Authorization": `Bearer pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx` },
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/datos_fiscales');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPGET => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    u, _ := url.Parse("https://nexus.cfdi4.com/api/consultas/datos_fiscales")
    q := u.Query()
    q.Set("rfc", "ABC010101ABC")
    u.RawQuery = q.Encode()
    req, _ := http.NewRequest("GET", u.String(), nil)
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/datos_fiscales"))
            .header("Authorization", "Bearer " + apiKey)
            .GET()
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var response = await client.GetAsync("https://nexus.cfdi4.com/api/consultas/datos_fiscales");
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "rfc": "ABC010101ABC",
    "razonSocial": "TEST SA DE CV",
    "codigoPostal": "06000",
    "regimenFiscal": "601",
    "emailFacturacion": "test@empresa.com"
  }
}

Codigos de error

401apiclave_faltanteNo se envio la API key.
403rfc_no_autorizadoRFC no coincide.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "apiclave_invalida",
    "mensaje": "La API key no es valida."
  }
}

Constancia de Situacion Fiscal1

Consulta la Constancia de Situacion Fiscal (CSF) del RFC asociado a tu API key. Requiere CIEC del SAT + captcha + CIEC capturada.

GET
/api/consultas/constancia_fiscal
Consulta la CSF del RFC. Flujo: 1) /api/consultas/captcha?type=csf&antiCaptcha=true para obtener catpchaValue, 2) esta llamada con captchaText=catpchaValue. Requiere CIEC del SAT guardada.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSITu API key.
rfcBody/Querystring (12-13)SIRFC.
captchaTextQuerystringSIDel captcha.
requestIdQuerystring (uuid)SIDel captcha.

Respuestas

200 CSF · 400 datos invalidos · 502 backend no disponible

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X GET "https://nexus.cfdi4.com/api/consultas/constancia_fiscal?rfc=ABC010101ABC&captchaText=...&requestId=..." \
  -H "Authorization: Bearer $API_KEY"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

params = {
    "rfc": "ABC010101ABC",
    "captchaText": "...",
    "requestId": "...",
}
headers = {"Authorization": f"Bearer {API_KEY}"}
response = requests.get("https://nexus.cfdi4.com/api/consultas/constancia_fiscal", params=params, headers=headers)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const url = new URL("https://nexus.cfdi4.com/api/consultas/constancia_fiscal?rfc=ABC010101ABC&captchaText=...&requestId=...");
const response = await fetch(url, {
    headers: { "Authorization": `Bearer pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx` },
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/constancia_fiscal');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPGET => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    u, _ := url.Parse("https://nexus.cfdi4.com/api/consultas/constancia_fiscal")
    q := u.Query()
    q.Set("rfc", "ABC010101ABC")
    q.Set("captchaText", "...")
    q.Set("requestId", "...")
    u.RawQuery = q.Encode()
    req, _ := http.NewRequest("GET", u.String(), nil)
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/constancia_fiscal"))
            .header("Authorization", "Bearer " + apiKey)
            .GET()
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var response = await client.GetAsync("https://nexus.cfdi4.com/api/consultas/constancia_fiscal");
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": [
    {
      "rfc": "ABC010101ABC",
      "razonSocial": "EMPRESA DEMO SA DE CV",
      "regimenFiscal": "601",
      "domicilio": { "calle": "AV. EJEMPLO 123", "colonia": "CENTRO", "cp": "06000", "municipio": "CUAUHTEMOC", "estado": "CDMX" },
      "pdfBase64": "JVBERi0xLjQKJ...",
      "fechaExpedicion": "2026-08-15",
      "fechaConsulta": "2026-09-07T22:30:00Z"
    }
  ]
}

Codigos de error

400motor_error_400The captchaText field is required.
502motor_no_disponibleEl servicio de consulta del SAT no esta disponible.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "motor_error_400",
    "mensaje": "The captchaText field is required."
  }
}

Cumplimiento de obligaciones2

Opinion de Cumplimiento de obligaciones fiscales y Declaraciones de pagos del SAT. Requieren CIEC + captcha + CIEC capturada.

GET
/api/consultas/opinion_cumplimiento
Consulta la opinion de cumplimiento fiscal del RFC. Mismo flujo que csf: requiere captcha + requestId + CIEC del SAT.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSITu API key.
rfcBody/Querystring (12-13)SIRFC.
captchaTextQuerystringSIDel captcha.
requestIdQuerystring (uuid)SIDel captcha.

Respuestas

200 OpinionCumplimiento · 502 backend no disponible

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X GET "https://nexus.cfdi4.com/api/consultas/opinion_cumplimiento?rfc=ABC010101ABC&captchaText=...&requestId=..." \
  -H "Authorization: Bearer $API_KEY"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

params = {
    "rfc": "ABC010101ABC",
    "captchaText": "...",
    "requestId": "...",
}
headers = {"Authorization": f"Bearer {API_KEY}"}
response = requests.get("https://nexus.cfdi4.com/api/consultas/opinion_cumplimiento", params=params, headers=headers)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const url = new URL("https://nexus.cfdi4.com/api/consultas/opinion_cumplimiento?rfc=ABC010101ABC&captchaText=...&requestId=...");
const response = await fetch(url, {
    headers: { "Authorization": `Bearer pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx` },
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/opinion_cumplimiento');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPGET => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    u, _ := url.Parse("https://nexus.cfdi4.com/api/consultas/opinion_cumplimiento")
    q := u.Query()
    q.Set("rfc", "ABC010101ABC")
    q.Set("captchaText", "...")
    q.Set("requestId", "...")
    u.RawQuery = q.Encode()
    req, _ := http.NewRequest("GET", u.String(), nil)
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/opinion_cumplimiento"))
            .header("Authorization", "Bearer " + apiKey)
            .GET()
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var response = await client.GetAsync("https://nexus.cfdi4.com/api/consultas/opinion_cumplimiento");
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "rfc": "ABC010101ABC",
    "opinion": "POSITIVA",
    "fechaConsulta": "2026-09-07T22:30:00Z",
    "pdfBase64": "JVBERi0xLjQKJ..."
  }
}

Codigos de error

400motor_error_400The captchaText field is required.
502motor_no_disponibleEl servicio no esta disponible.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "motor_error_400",
    "mensaje": "The captchaText field is required."
  }
}
GET
/api/consultas/declaraciones
Consulta las declaraciones de pagos del SAT. Requiere captcha + requestId + CIEC + ejercicio (ano fiscal) + mes (1-12 o 0=todo el ano).

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSITu API key.
rfcBody/Querystring (12-13)SIRFC.
captchaTextQuerystringSIDel captcha.
requestIdQuerystring (uuid)SIDel captcha.
ejercicioQueryintSIEjercicio fiscal (e.g. 2024).
dec_mesQueryint (0-12)SIMes fiscal. 1-12 o 0 para todo el ano.

Respuestas

200 Declaraciones · 400 falta ejercicio/mes · 502 backend no disponible

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X GET "https://nexus.cfdi4.com/api/consultas/declaraciones?rfc=ABC010101ABC&captchaText=...&requestId=...&ejercicio=0&dec_mes=0" \
  -H "Authorization: Bearer $API_KEY"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

params = {
    "rfc": "ABC010101ABC",
    "captchaText": "...",
    "requestId": "...",
    "ejercicio": "0",
    "dec_mes": "0",
}
headers = {"Authorization": f"Bearer {API_KEY}"}
response = requests.get("https://nexus.cfdi4.com/api/consultas/declaraciones", params=params, headers=headers)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const url = new URL("https://nexus.cfdi4.com/api/consultas/declaraciones?rfc=ABC010101ABC&captchaText=...&requestId=...&ejercicio=0&dec_mes=0");
const response = await fetch(url, {
    headers: { "Authorization": `Bearer pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx` },
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/declaraciones');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPGET => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    u, _ := url.Parse("https://nexus.cfdi4.com/api/consultas/declaraciones")
    q := u.Query()
    q.Set("rfc", "ABC010101ABC")
    q.Set("captchaText", "...")
    q.Set("requestId", "...")
    q.Set("ejercicio", "0")
    q.Set("dec_mes", "0")
    u.RawQuery = q.Encode()
    req, _ := http.NewRequest("GET", u.String(), nil)
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/declaraciones"))
            .header("Authorization", "Bearer " + apiKey)
            .GET()
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var response = await client.GetAsync("https://nexus.cfdi4.com/api/consultas/declaraciones");
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "ejercicio": 2024,
    "mes": 1,
    "declaraciones": [
      { "tipo": "normal", "fechaPresentacion": "2024-02-15", "estatus": "presentada" }
    ]
  }
}

Codigos de error

400motor_error_400The captchaText field is required.
502motor_no_disponibleEl servicio no esta disponible.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "motor_error_400",
    "mensaje": "The captchaText field is required."
  }
}

Comprobantes fiscales (CFDI)2

Descarga masiva de CFDIs emitidos y recibidos, consulta estado de un CFDI (vigente/cancelado) y resolucion automatica del captcha del SAT.

GET
/api/consultas/captcha
Devuelve la imagen del captcha del SAT (base64) + requestId. Con antiCaptcha=true (default), la plataforma resuelve automaticamente el captcha y devuelve un campo catpchaValue con el texto resuelto. Asi el cliente final no necesita UI de captcha.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSITu API key.
rfcBody/Querystring (12-13)SIRFC.
typeQuerystring-csf (default), oc, fac o dec.
antiCaptchaQuerybool-Si es true (default), la plataforma resuelve el captcha automaticamente.

Respuestas

200 Captcha · 400 RFC/CIEC requeridos · 401 sin auth

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X GET "https://nexus.cfdi4.com/api/consultas/captcha?rfc=ABC010101ABC&type=...&antiCaptcha=0" \
  -H "Authorization: Bearer $API_KEY"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

params = {
    "rfc": "ABC010101ABC",
    "type": "...",
    "antiCaptcha": "0",
}
headers = {"Authorization": f"Bearer {API_KEY}"}
response = requests.get("https://nexus.cfdi4.com/api/consultas/captcha", params=params, headers=headers)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const url = new URL("https://nexus.cfdi4.com/api/consultas/captcha?rfc=ABC010101ABC&type=...&antiCaptcha=0");
const response = await fetch(url, {
    headers: { "Authorization": `Bearer pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx` },
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/captcha');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPGET => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    u, _ := url.Parse("https://nexus.cfdi4.com/api/consultas/captcha")
    q := u.Query()
    q.Set("rfc", "ABC010101ABC")
    q.Set("type", "...")
    q.Set("antiCaptcha", "0")
    u.RawQuery = q.Encode()
    req, _ := http.NewRequest("GET", u.String(), nil)
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/captcha"))
            .header("Authorization", "Bearer " + apiKey)
            .GET()
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var response = await client.GetAsync("https://nexus.cfdi4.com/api/consultas/captcha");
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "formActionUrl": "https://login.siat.sat.gob.mx/nidp/idff/sso?id=...",
    "captchaImage": "iVBORw0KGgoAAAANSUhEUgAAAKAA...",
    "requestId": "a53aed56-272e-4916-8f28-6b7896b6d8e6",
    "catpchaValue": "KSM35V"
  }
}

Codigos de error

400motor_error_400RFC y Ciec son requeridos.
401apiclave_faltanteNo se envio la API key.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "cliente_no_vinculado_backend",
    "mensaje": "El cliente no esta vinculado con el backend."
  }
}
GET
/api/consultas/facturas
Descarga CFDIs del portal del SAT. Requiere captcha + requestId + CIEC + tipo (emitidos|recibidos) + tipoBusqueda (0=UUID, 1=Fecha) + anio/mes/dia o UUID.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSITu API key.
rfcBody/Querystring (12-13)SIRFC.
captchaTextQuerystringSIDel captcha.
requestIdQuerystring (uuid)SIDel captcha.
tipoQuerystringSIemitidos o recibidos.
tipoBusquedaQueryint (0|1)-0=UUID, 1=Fecha.
UUIDQuerystring (uuid)-UUID del CFDI.
estatusFacturaQueryint (-1|0|1)--1=todos, 0=cancelados, 1=vigentes.
anioQueryint-Ano de emision.
mesQueryint (1-12)-Mes de emision.
diaQueryint (1-31)-Dia de emision.

Respuestas

200 ListadoCFDIs · 400 falta tipo · 502 backend no disponible

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X GET "https://nexus.cfdi4.com/api/consultas/facturas?rfc=ABC010101ABC&captchaText=...&requestId=...&tipo=...&tipoBusqueda=0&UUID=...&estatusFactura=0&anio=0&mes=0&dia=0" \
  -H "Authorization: Bearer $API_KEY"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

params = {
    "rfc": "ABC010101ABC",
    "captchaText": "...",
    "requestId": "...",
    "tipo": "...",
    "tipoBusqueda": "0",
    "UUID": "...",
    "estatusFactura": "0",
    "anio": "0",
    "mes": "0",
    "dia": "0",
}
headers = {"Authorization": f"Bearer {API_KEY}"}
response = requests.get("https://nexus.cfdi4.com/api/consultas/facturas", params=params, headers=headers)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const url = new URL("https://nexus.cfdi4.com/api/consultas/facturas?rfc=ABC010101ABC&captchaText=...&requestId=...&tipo=...&tipoBusqueda=0&UUID=...&estatusFactura=0&anio=0&mes=0&dia=0");
const response = await fetch(url, {
    headers: { "Authorization": `Bearer pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx` },
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/facturas');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPGET => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    u, _ := url.Parse("https://nexus.cfdi4.com/api/consultas/facturas")
    q := u.Query()
    q.Set("rfc", "ABC010101ABC")
    q.Set("captchaText", "...")
    q.Set("requestId", "...")
    q.Set("tipo", "...")
    q.Set("tipoBusqueda", "0")
    q.Set("UUID", "...")
    q.Set("estatusFactura", "0")
    q.Set("anio", "0")
    q.Set("mes", "0")
    q.Set("dia", "0")
    u.RawQuery = q.Encode()
    req, _ := http.NewRequest("GET", u.String(), nil)
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/facturas"))
            .header("Authorization", "Bearer " + apiKey)
            .GET()
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var response = await client.GetAsync("https://nexus.cfdi4.com/api/consultas/facturas");
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "total": 1,
    "cfdis": [
      { "uuid": "A9CC98B1-39CE-465C-AEC0-51CA3335280A", "fechaEmision": "2026-08-15T10:30:00", "tipo": "emitido", "estatus": "vigente", "monto": 1234.56 }
    ]
  }
}

Codigos de error

400motor_error_400The tipo field is required.
502motor_no_disponibleEl servicio no esta disponible.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "motor_error_400",
    "mensaje": "The tipo field is required."
  }
}

Opinion de Cumplimiento IMSS BETA1

Consulta la opinion de cumplimiento de obligaciones del IMSS. BETA: el backend sat-go v1 aun no expone este endpoint; mientras tanto devuelve 502.

GET
/api/consultas/opinion_imss
Consulta la opinion de cumplimiento de obligaciones patronales del IMSS. Estado BETA: el backend sat-go v1 NO expone este endpoint. La integracion requiere que sat-go publique el endpoint v1 correspondiente.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSITu API key.
rfcBody/Querystring (12-13)SIRFC.

Respuestas

200 OpinionIMSS · 502 backend sin soporte

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X GET "https://nexus.cfdi4.com/api/consultas/opinion_imss?rfc=ABC010101ABC" \
  -H "Authorization: Bearer $API_KEY"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

params = {
    "rfc": "ABC010101ABC",
}
headers = {"Authorization": f"Bearer {API_KEY}"}
response = requests.get("https://nexus.cfdi4.com/api/consultas/opinion_imss", params=params, headers=headers)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const url = new URL("https://nexus.cfdi4.com/api/consultas/opinion_imss?rfc=ABC010101ABC");
const response = await fetch(url, {
    headers: { "Authorization": `Bearer pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx` },
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/opinion_imss');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPGET => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    u, _ := url.Parse("https://nexus.cfdi4.com/api/consultas/opinion_imss")
    q := u.Query()
    q.Set("rfc", "ABC010101ABC")
    u.RawQuery = q.Encode()
    req, _ := http.NewRequest("GET", u.String(), nil)
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/opinion_imss"))
            .header("Authorization", "Bearer " + apiKey)
            .GET()
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var response = await client.GetAsync("https://nexus.cfdi4.com/api/consultas/opinion_imss");
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "rfc": "ABC010101ABC",
    "opinion": "POSITIVA",
    "fechaConsulta": "2026-09-10T00:00:00Z"
  }
}

Codigos de error

502motor_no_disponiblesat-go v1 no expone el endpoint. Pendiente de publicacion.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "motor_no_disponible",
    "mensaje": "El servicio de consulta del SAT no esta disponible. Intenta de nuevo en unos minutos."
  }
}

Busqueda EFOS (Lista Negra 69-B) BETA1

Consulta la lista negra del art. 69-B del CFF (EFOS: Empresas que Facturan Operaciones Simuladas). BETA: el backend sat-go v1 aun no expone este endpoint; mientras tanto devuelve 502.

GET
/api/consultas/lista_negra_69b/{rfc}
Consulta si un RFC aparece en la lista negra del articulo 69-B del CFF (operaciones simuladas). Estado BETA: el backend sat-go v1 NO expone este endpoint.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSITu API key.
rfcPathstring (12-13)SIRFC en el path.

Respuestas

200 EFOSStatus · 502 backend sin soporte

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X GET "https://nexus.cfdi4.com/api/consultas/lista_negra_69b/{rfc}?rfc=ABC010101ABC" \
  -H "Authorization: Bearer $API_KEY"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

params = {
    "rfc": "ABC010101ABC",
}
headers = {"Authorization": f"Bearer {API_KEY}"}
response = requests.get("https://nexus.cfdi4.com/api/consultas/lista_negra_69b/{rfc}", params=params, headers=headers)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const url = new URL("https://nexus.cfdi4.com/api/consultas/lista_negra_69b/{rfc}?rfc=ABC010101ABC");
const response = await fetch(url, {
    headers: { "Authorization": `Bearer pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx` },
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/lista_negra_69b/{rfc}');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPGET => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    u, _ := url.Parse("https://nexus.cfdi4.com/api/consultas/lista_negra_69b/{rfc}")
    q := u.Query()
    q.Set("rfc", "ABC010101ABC")
    u.RawQuery = q.Encode()
    req, _ := http.NewRequest("GET", u.String(), nil)
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/lista_negra_69b/{rfc}"))
            .header("Authorization", "Bearer " + apiKey)
            .GET()
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var response = await client.GetAsync("https://nexus.cfdi4.com/api/consultas/lista_negra_69b/{rfc}");
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "rfc": "ABC010101ABC",
    "enListaNegra": false,
    "fechaConsulta": "2026-09-10T00:00:00Z"
  }
}

Codigos de error

502motor_no_disponiblesat-go v1 no expone el endpoint. Pendiente de publicacion.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "motor_no_disponible",
    "mensaje": "El servicio de consulta del SAT no esta disponible. Intenta de nuevo en unos minutos."
  }
}

REPSE (Registro de Prestadores de Servicios) BETA1

Consulta el REPSE: registro de prestadores de servicios especializados del art. 15-I de la LFT. BETA: el backend sat-go v1 aun no expone este endpoint; mientras tanto devuelve 502.

GET
/api/consultas/repse
Consulta si un RFC esta dado de alta en el REPSE. Estado BETA: el backend sat-go v1 NO expone este endpoint.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSITu API key.
rfcBody/Querystring (12-13)SIRFC.

Respuestas

200 REPSEStatus · 502 backend sin soporte

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X GET "https://nexus.cfdi4.com/api/consultas/repse?rfc=ABC010101ABC" \
  -H "Authorization: Bearer $API_KEY"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

params = {
    "rfc": "ABC010101ABC",
}
headers = {"Authorization": f"Bearer {API_KEY}"}
response = requests.get("https://nexus.cfdi4.com/api/consultas/repse", params=params, headers=headers)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const url = new URL("https://nexus.cfdi4.com/api/consultas/repse?rfc=ABC010101ABC");
const response = await fetch(url, {
    headers: { "Authorization": `Bearer pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx` },
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/repse');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPGET => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    u, _ := url.Parse("https://nexus.cfdi4.com/api/consultas/repse")
    q := u.Query()
    q.Set("rfc", "ABC010101ABC")
    u.RawQuery = q.Encode()
    req, _ := http.NewRequest("GET", u.String(), nil)
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/repse"))
            .header("Authorization", "Bearer " + apiKey)
            .GET()
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var response = await client.GetAsync("https://nexus.cfdi4.com/api/consultas/repse");
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "rfc": "ABC010101ABC",
    "registrado": true,
    "actividadPrincipal": "Servicios de consultoria"
  }
}

Codigos de error

502motor_no_disponiblesat-go v1 no expone el endpoint. Pendiente de publicacion.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "motor_no_disponible",
    "mensaje": "El servicio de consulta del SAT no esta disponible. Intenta de nuevo en unos minutos."
  }
}

Constancia de Retenciones BETA1

Descarga la constancia de retenciones del SAT. BETA: el backend sat-go v1 aun no expone este endpoint; requiere FIEL cargada en la cuenta.

POST
/api/consultas/retenciones
Descarga la constancia de retenciones de impuestos federales. Estado BETA: el backend sat-go v1 NO expone este endpoint. Requiere FIEL cargada en /api/consultas/fiel_encryption_key.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSITu API key.
rfcBodystring (12-13)SIRFC del contribuyente.

Respuestas

200 RetencionPDF · 502 backend sin soporte

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X POST "https://nexus.cfdi4.com/api/consultas/retenciones" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  --data-urlencode "apiclave=$API_KEY" \
  --data-urlencode "rfc=ABC010101ABC"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

data = {"apiclave": API_KEY, "rfc": "ABC010101ABC"}
response = requests.post("https://nexus.cfdi4.com/api/consultas/retenciones", data=data)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const params = new URLSearchParams({ apiclave: API_KEY, "rfc": "ABC010101ABC" });
const response = await fetch("https://nexus.cfdi4.com/api/consultas/retenciones", {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: params,
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/retenciones');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query([
        'apiclave' => $API_KEY,
        'rfc' => 'ABC010101ABC',
    ]),
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    form := url.Values{}
    form.Set("apiclave", apiKey)
    form.Set("rfc", "ABC010101ABC")
    req, _ := http.NewRequest("POST", "https://nexus.cfdi4.com/api/consultas/retenciones", strings.NewReader(form.Encode()))
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        String body = "apiclave=" + apiKey
                     + "&rfc=ABC010101ABC";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/retenciones"))
            .header("Content-Type", "application/x-www-form-urlencoded")
            .header("Authorization", "Bearer " + apiKey)
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var content = new FormUrlEncodedContent(new[] {
            new KeyValuePair<string, string>("apiclave", apiKey),
            new KeyValuePair<string, string>("rfc", "ABC010101ABC")
        });
        var response = await client.PostAsync("https://nexus.cfdi4.com/api/consultas/retenciones", content);
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "rfc": "ABC010101ABC",
    "pdfBase64": "JVBERi0xLjQKJ...",
    "fechaEmision": "2026-09-10"
  }
}

Codigos de error

502motor_no_disponiblesat-go v1 no expone el endpoint. Pendiente de publicacion.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "motor_no_disponible",
    "mensaje": "El servicio de consulta del SAT no esta disponible. Intenta de nuevo en unos minutos."
  }
}

Notificaciones del SAT BETA1

Consulta las notificaciones electronicas del SAT. BETA: el backend sat-go v1 aun no expone este endpoint; requiere FIEL cargada en la cuenta.

POST
/api/consultas/notificaciones
Consulta las notificaciones electronicas del SAT (buzon tributario). Estado BETA: el backend sat-go v1 NO expone este endpoint. Requiere FIEL cargada.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSITu API key.
rfcBodystring (12-13)SIRFC del contribuyente.

Respuestas

200 Notificaciones · 502 backend sin soporte

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X POST "https://nexus.cfdi4.com/api/consultas/notificaciones" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  --data-urlencode "apiclave=$API_KEY" \
  --data-urlencode "rfc=ABC010101ABC"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

data = {"apiclave": API_KEY, "rfc": "ABC010101ABC"}
response = requests.post("https://nexus.cfdi4.com/api/consultas/notificaciones", data=data)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const params = new URLSearchParams({ apiclave: API_KEY, "rfc": "ABC010101ABC" });
const response = await fetch("https://nexus.cfdi4.com/api/consultas/notificaciones", {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: params,
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/notificaciones');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query([
        'apiclave' => $API_KEY,
        'rfc' => 'ABC010101ABC',
    ]),
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    form := url.Values{}
    form.Set("apiclave", apiKey)
    form.Set("rfc", "ABC010101ABC")
    req, _ := http.NewRequest("POST", "https://nexus.cfdi4.com/api/consultas/notificaciones", strings.NewReader(form.Encode()))
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        String body = "apiclave=" + apiKey
                     + "&rfc=ABC010101ABC";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/notificaciones"))
            .header("Content-Type", "application/x-www-form-urlencoded")
            .header("Authorization", "Bearer " + apiKey)
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var content = new FormUrlEncodedContent(new[] {
            new KeyValuePair<string, string>("apiclave", apiKey),
            new KeyValuePair<string, string>("rfc", "ABC010101ABC")
        });
        var response = await client.PostAsync("https://nexus.cfdi4.com/api/consultas/notificaciones", content);
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "rfc": "ABC010101ABC",
    "total": 3,
    "notificaciones": [
      { "id": "NOTI-001", "tipo": "Requerimiento", "fecha": "2026-08-15", "leida": false }
    ]
  }
}

Codigos de error

502motor_no_disponiblesat-go v1 no expone el endpoint. Pendiente de publicacion.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "motor_no_disponible",
    "mensaje": "El servicio de consulta del SAT no esta disponible. Intenta de nuevo en unos minutos."
  }
}

Comunicados del SAT BETA1

Consulta los comunicados electronicos del SAT. BETA: el backend sat-go v1 aun no expone este endpoint; requiere FIEL cargada en la cuenta.

POST
/api/consultas/comunicados
Consulta los comunicados electronicos del SAT. Estado BETA: el backend sat-go v1 NO expone este endpoint. Requiere FIEL cargada.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSITu API key.
rfcBodystring (12-13)SIRFC del contribuyente.

Respuestas

200 Comunicados · 502 backend sin soporte

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X POST "https://nexus.cfdi4.com/api/consultas/comunicados" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  --data-urlencode "apiclave=$API_KEY" \
  --data-urlencode "rfc=ABC010101ABC"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

data = {"apiclave": API_KEY, "rfc": "ABC010101ABC"}
response = requests.post("https://nexus.cfdi4.com/api/consultas/comunicados", data=data)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const params = new URLSearchParams({ apiclave: API_KEY, "rfc": "ABC010101ABC" });
const response = await fetch("https://nexus.cfdi4.com/api/consultas/comunicados", {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: params,
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/comunicados');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query([
        'apiclave' => $API_KEY,
        'rfc' => 'ABC010101ABC',
    ]),
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    form := url.Values{}
    form.Set("apiclave", apiKey)
    form.Set("rfc", "ABC010101ABC")
    req, _ := http.NewRequest("POST", "https://nexus.cfdi4.com/api/consultas/comunicados", strings.NewReader(form.Encode()))
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        String body = "apiclave=" + apiKey
                     + "&rfc=ABC010101ABC";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/comunicados"))
            .header("Content-Type", "application/x-www-form-urlencoded")
            .header("Authorization", "Bearer " + apiKey)
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var content = new FormUrlEncodedContent(new[] {
            new KeyValuePair<string, string>("apiclave", apiKey),
            new KeyValuePair<string, string>("rfc", "ABC010101ABC")
        });
        var response = await client.PostAsync("https://nexus.cfdi4.com/api/consultas/comunicados", content);
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "rfc": "ABC010101ABC",
    "total": 5,
    "comunicados": [
      { "id": "COM-001", "tipo": "Aviso", "fecha": "2026-08-20" }
    ]
  }
}

Codigos de error

502motor_no_disponiblesat-go v1 no expone el endpoint. Pendiente de publicacion.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "motor_no_disponible",
    "mensaje": "El servicio de consulta del SAT no esta disponible. Intenta de nuevo en unos minutos."
  }
}

Credenciales SAT - CIEC4

Gestion de la Clave de Identificacion Electronica Confidencial (CIEC) del SAT. Necesaria para hacer consultas al SAT. La CIEC se cifra con AES-256-GCM y se guarda en tu cuenta.

POST
/api/consultas/ciec_registrar
Registra un proveedor externo (Azure Key Vault, AWS) para almacenar la CIEC del RFC. Alternativa al header Secret manual.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSIAPI key.
rfcBody/Querystring (12-13)SIRFC.

Respuestas

200 SecretProvider · 400 body invalido

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X POST "https://nexus.cfdi4.com/api/consultas/ciec_registrar?rfc=ABC010101ABC" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  --data-urlencode "apiclave=$API_KEY"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

data = {"apiclave": API_KEY}
response = requests.post("https://nexus.cfdi4.com/api/consultas/ciec_registrar", data=data)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const params = new URLSearchParams({ apiclave: API_KEY });
const response = await fetch("https://nexus.cfdi4.com/api/consultas/ciec_registrar", {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: params,
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/ciec_registrar');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query([
        'apiclave' => $API_KEY,
    ]),
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    form := url.Values{}
    form.Set("apiclave", apiKey)
    req, _ := http.NewRequest("POST", "https://nexus.cfdi4.com/api/consultas/ciec_registrar", strings.NewReader(form.Encode()))
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        String body = "apiclave=" + apiKey;

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/ciec_registrar"))
            .header("Content-Type", "application/x-www-form-urlencoded")
            .header("Authorization", "Bearer " + apiKey)
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var content = new FormUrlEncodedContent(new[] {
            new KeyValuePair<string, string>("apiclave", apiKey)
        });
        var response = await client.PostAsync("https://nexus.cfdi4.com/api/consultas/ciec_registrar", content);
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "rfc": "ABC010101ABC",
    "providerType": "platformManaged",
    "isRegistered": true
  }
}

Codigos de error

400motor_error_400Validation failed.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "motor_error_400",
    "mensaje": "Validation failed: providerType is required."
  }
}
POST
/api/consultas/ciec_guardar
Guarda la CIEC del SAT cifrada en el vault gestionado por la plataforma. Alternativa al header Secret.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSIAPI key.
rfcBody/Querystring (12-13)SIRFC.

Respuestas

200 SecretStored · 404 RFC no registrado

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X POST "https://nexus.cfdi4.com/api/consultas/ciec_guardar?rfc=ABC010101ABC" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  --data-urlencode "apiclave=$API_KEY"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

data = {"apiclave": API_KEY}
response = requests.post("https://nexus.cfdi4.com/api/consultas/ciec_guardar", data=data)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const params = new URLSearchParams({ apiclave: API_KEY });
const response = await fetch("https://nexus.cfdi4.com/api/consultas/ciec_guardar", {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: params,
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/ciec_guardar');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query([
        'apiclave' => $API_KEY,
    ]),
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    form := url.Values{}
    form.Set("apiclave", apiKey)
    req, _ := http.NewRequest("POST", "https://nexus.cfdi4.com/api/consultas/ciec_guardar", strings.NewReader(form.Encode()))
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        String body = "apiclave=" + apiKey;

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/ciec_guardar"))
            .header("Content-Type", "application/x-www-form-urlencoded")
            .header("Authorization", "Bearer " + apiKey)
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var content = new FormUrlEncodedContent(new[] {
            new KeyValuePair<string, string>("apiclave", apiKey)
        });
        var response = await client.PostAsync("https://nexus.cfdi4.com/api/consultas/ciec_guardar", content);
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "rfc": "ABC010101ABC",
    "providerType": "platformManaged",
    "secretName": "ciec-abc010101abc",
    "message": "Secreto guardado exitosamente"
  }
}

Codigos de error

404motor_error_404RFC no registrado.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "motor_error_404",
    "mensaje": "El RFC XXXX no esta registrado para este usuario."
  }
}
DELETE
/api/consultas/ciec/{rfc}
Elimina el proveedor de secretos de un RFC. A partir de ahi, el RFC requiere el header Secret en cada llamada.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSIAPI key.
rfcPathstring (12-13)SIRFC en el path.

Respuestas

200 SecretDeleted · 404 RFC no registrado

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X DELETE "https://nexus.cfdi4.com/api/consultas/ciec/{rfc}" \
  -H "Authorization: Bearer $API_KEY"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

data = {"apiclave": API_KEY, "rfc": "ABC010101ABC"}
response = requests.post("https://nexus.cfdi4.com/api/consultas/ciec/{rfc}", data=data)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const params = new URLSearchParams({ apiclave: API_KEY, "rfc": "ABC010101ABC" });
const response = await fetch("https://nexus.cfdi4.com/api/consultas/ciec/{rfc}", {
    method: "DELETE",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: params,
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/ciec/{rfc}');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPGET => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    form := url.Values{}
    form.Set("apiclave", apiKey)
    form.Set("rfc", "ABC010101ABC")
    req, _ := http.NewRequest("POST", "https://nexus.cfdi4.com/api/consultas/ciec/{rfc}", strings.NewReader(form.Encode()))
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        String body = "apiclave=" + apiKey
                     + "&rfc=ABC010101ABC";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/ciec/{rfc}"))
            .header("Content-Type", "application/x-www-form-urlencoded")
            .header("Authorization", "Bearer " + apiKey)
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var content = new FormUrlEncodedContent(new[] {
            new KeyValuePair<string, string>("apiclave", apiKey),
            new KeyValuePair<string, string>("rfc", "ABC010101ABC")
        });
        var response = await client.PostAsync("https://nexus.cfdi4.com/api/consultas/ciec/{rfc}", content);
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "rfc": "ABC010101ABC",
    "message": "Proveedor de secretos eliminado. El RFC requiere header Secret nuevamente."
  }
}

Codigos de error

404motor_error_404RFC no registrado.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "motor_error_404",
    "mensaje": "El RFC XXXX no esta registrado."
  }
}
GET
/api/consultas/ciec_estado/{rfc}
Consulta si un RFC tiene un proveedor de secretos registrado. Nunca devuelve el valor del secreto.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSIAPI key.
rfcPathstring (12-13)SIRFC en el path.

Respuestas

200 SecretStatus

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X GET "https://nexus.cfdi4.com/api/consultas/ciec_estado/{rfc}?rfc=ABC010101ABC" \
  -H "Authorization: Bearer $API_KEY"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

params = {
    "rfc": "ABC010101ABC",
}
headers = {"Authorization": f"Bearer {API_KEY}"}
response = requests.get("https://nexus.cfdi4.com/api/consultas/ciec_estado/{rfc}", params=params, headers=headers)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const url = new URL("https://nexus.cfdi4.com/api/consultas/ciec_estado/{rfc}?rfc=ABC010101ABC");
const response = await fetch(url, {
    headers: { "Authorization": `Bearer pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx` },
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/ciec_estado/{rfc}');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPGET => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    u, _ := url.Parse("https://nexus.cfdi4.com/api/consultas/ciec_estado/{rfc}")
    q := u.Query()
    q.Set("rfc", "ABC010101ABC")
    u.RawQuery = q.Encode()
    req, _ := http.NewRequest("GET", u.String(), nil)
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/ciec_estado/{rfc}"))
            .header("Authorization", "Bearer " + apiKey)
            .GET()
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var response = await client.GetAsync("https://nexus.cfdi4.com/api/consultas/ciec_estado/{rfc}");
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "rfc": "ABC010101ABC",
    "isRegistered": true,
    "providerType": "platformManaged",
    "providerUri": null,
    "secretName": "ciec-abc010101abc"
  }
}

Codigos de error

404motor_error_404RFC no registrado.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "motor_error_404",
    "mensaje": "El RFC XXXX no esta registrado."
  }
}

Credenciales SAT - FIEL5

Gestion de la Firma Electronica (FIEL) del SAT. Permite firmar CFDIs y operaciones que requieren autenticacion con e.firma. Se cifra con AES-256-GCM y se guarda en tu cuenta.

GET
/api/consultas/fiel_clave_publica
Devuelve la llave publica RSA-OAEP-256 que el cliente usa para cifrar los archivos de la FIEL (.cer, .key, .pfx) antes de enviarlos. La plataforma descifra en su vault seguro.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSIAPI key.

Respuestas

200 JWERecipient · 401 sin auth

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X GET "https://nexus.cfdi4.com/api/consultas/fiel_clave_publica" \
  -H "Authorization: Bearer $API_KEY"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

data = {"apiclave": API_KEY}
response = requests.post("https://nexus.cfdi4.com/api/consultas/fiel_clave_publica", data=data)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const params = new URLSearchParams({ apiclave: API_KEY });
const response = await fetch("https://nexus.cfdi4.com/api/consultas/fiel_clave_publica", {
    method: "GET",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: params,
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/fiel_clave_publica');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPGET => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    form := url.Values{}
    form.Set("apiclave", apiKey)
    req, _ := http.NewRequest("POST", "https://nexus.cfdi4.com/api/consultas/fiel_clave_publica", strings.NewReader(form.Encode()))
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        String body = "apiclave=" + apiKey;

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/fiel_clave_publica"))
            .header("Content-Type", "application/x-www-form-urlencoded")
            .header("Authorization", "Bearer " + apiKey)
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var content = new FormUrlEncodedContent(new[] {
            new KeyValuePair<string, string>("apiclave", apiKey)
        });
        var response = await client.PostAsync("https://nexus.cfdi4.com/api/consultas/fiel_clave_publica", content);
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "description": "Cifra cada campo sensible de la FIEL como un JWE compacto...",
    "publicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...\n-----END PUBLIC KEY-----"
  }
}

Codigos de error

401apiclave_faltanteNo se envio la API key.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "apiclave_invalida",
    "mensaje": "La API key no es valida."
  }
}
POST
/api/consultas/fiel_registrar
Registra un proveedor externo (AzureKeyVault, AwsKms) para almacenar la llave privada de firma. A partir de ahi, enviar solo el .cer es suficiente.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSIAPI key.
rfcBody/Querystring (12-13)SIRFC.

Respuestas

200 SigningKeyProvider · 400 body invalido

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X POST "https://nexus.cfdi4.com/api/consultas/fiel_registrar?rfc=ABC010101ABC" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  --data-urlencode "apiclave=$API_KEY"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

data = {"apiclave": API_KEY}
response = requests.post("https://nexus.cfdi4.com/api/consultas/fiel_registrar", data=data)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const params = new URLSearchParams({ apiclave: API_KEY });
const response = await fetch("https://nexus.cfdi4.com/api/consultas/fiel_registrar", {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: params,
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/fiel_registrar');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query([
        'apiclave' => $API_KEY,
    ]),
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    form := url.Values{}
    form.Set("apiclave", apiKey)
    req, _ := http.NewRequest("POST", "https://nexus.cfdi4.com/api/consultas/fiel_registrar", strings.NewReader(form.Encode()))
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        String body = "apiclave=" + apiKey;

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/fiel_registrar"))
            .header("Content-Type", "application/x-www-form-urlencoded")
            .header("Authorization", "Bearer " + apiKey)
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var content = new FormUrlEncodedContent(new[] {
            new KeyValuePair<string, string>("apiclave", apiKey)
        });
        var response = await client.PostAsync("https://nexus.cfdi4.com/api/consultas/fiel_registrar", content);
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "rfc": "ABC010101ABC",
    "providerType": "platformManaged",
    "isRegistered": true
  }
}

Codigos de error

400motor_error_400Validation failed.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "motor_error_400",
    "mensaje": "Validation failed: providerType is required."
  }
}
POST
/api/consultas/fiel_guardar
Importa la FIEL (.cer + .key) como PKCS12 al vault gestionado por la plataforma. A partir de ahi, enviar solo el .cer es suficiente.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSIAPI key.
rfcBody/Querystring (12-13)SIRFC.

Respuestas

200 SigningKeyStored · 400 certificado invalido

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X POST "https://nexus.cfdi4.com/api/consultas/fiel_guardar?rfc=ABC010101ABC" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  --data-urlencode "apiclave=$API_KEY"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

data = {"apiclave": API_KEY}
response = requests.post("https://nexus.cfdi4.com/api/consultas/fiel_guardar", data=data)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const params = new URLSearchParams({ apiclave: API_KEY });
const response = await fetch("https://nexus.cfdi4.com/api/consultas/fiel_guardar", {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: params,
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/fiel_guardar');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query([
        'apiclave' => $API_KEY,
    ]),
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    form := url.Values{}
    form.Set("apiclave", apiKey)
    req, _ := http.NewRequest("POST", "https://nexus.cfdi4.com/api/consultas/fiel_guardar", strings.NewReader(form.Encode()))
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        String body = "apiclave=" + apiKey;

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/fiel_guardar"))
            .header("Content-Type", "application/x-www-form-urlencoded")
            .header("Authorization", "Bearer " + apiKey)
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var content = new FormUrlEncodedContent(new[] {
            new KeyValuePair<string, string>("apiclave", apiKey)
        });
        var response = await client.PostAsync("https://nexus.cfdi4.com/api/consultas/fiel_guardar", content);
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "rfc": "ABC010101ABC",
    "message": "FIEL importada al vault exitosamente"
  }
}

Codigos de error

400motor_error_400Certificado o llave invalida.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "motor_error_400",
    "mensaje": "No se pudo parsear el certificado o la llave privada."
  }
}
DELETE
/api/consultas/fiel/{rfc}
Elimina el proveedor de firma de un RFC. A partir de ahi, el RFC requiere la llave privada (.key o .pfx) en cada peticion.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSIAPI key.
rfcPathstring (12-13)SIRFC en el path.

Respuestas

200 SigningKeyDeleted · 400 sin proveedor

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X DELETE "https://nexus.cfdi4.com/api/consultas/fiel/{rfc}" \
  -H "Authorization: Bearer $API_KEY"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

data = {"apiclave": API_KEY, "rfc": "ABC010101ABC"}
response = requests.post("https://nexus.cfdi4.com/api/consultas/fiel/{rfc}", data=data)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const params = new URLSearchParams({ apiclave: API_KEY, "rfc": "ABC010101ABC" });
const response = await fetch("https://nexus.cfdi4.com/api/consultas/fiel/{rfc}", {
    method: "DELETE",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: params,
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/fiel/{rfc}');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPGET => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    form := url.Values{}
    form.Set("apiclave", apiKey)
    form.Set("rfc", "ABC010101ABC")
    req, _ := http.NewRequest("POST", "https://nexus.cfdi4.com/api/consultas/fiel/{rfc}", strings.NewReader(form.Encode()))
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        String body = "apiclave=" + apiKey
                     + "&rfc=ABC010101ABC";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/fiel/{rfc}"))
            .header("Content-Type", "application/x-www-form-urlencoded")
            .header("Authorization", "Bearer " + apiKey)
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var content = new FormUrlEncodedContent(new[] {
            new KeyValuePair<string, string>("apiclave", apiKey),
            new KeyValuePair<string, string>("rfc", "ABC010101ABC")
        });
        var response = await client.PostAsync("https://nexus.cfdi4.com/api/consultas/fiel/{rfc}", content);
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "rfc": "ABC010101ABC",
    "message": "Proveedor de firma eliminado."
  }
}

Codigos de error

400motor_error_400Sin proveedor.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "motor_error_400",
    "mensaje": "El RFC XXXX no tiene un proveedor de firma registrado."
  }
}
GET
/api/consultas/fiel_estado/{rfc}
Consulta si un RFC tiene un proveedor de firma registrado.

Parametros

ParametroEnTipoReq.Descripcion
apiclaveBody/HeaderstringSIAPI key.
rfcPathstring (12-13)SIRFC en el path.

Respuestas

200 SigningKeyStatus

Ejemplos (7 lenguajes)

# 1. Tu API key de CFDi Nexus (visible solo en este ejemplo).
API_KEY="pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. Llamada al endpoint.
curl -X GET "https://nexus.cfdi4.com/api/consultas/fiel_estado/{rfc}?rfc=ABC010101ABC" \
  -H "Authorization: Bearer $API_KEY"
import requests

API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

params = {
    "rfc": "ABC010101ABC",
}
headers = {"Authorization": f"Bearer {API_KEY}"}
response = requests.get("https://nexus.cfdi4.com/api/consultas/fiel_estado/{rfc}", params=params, headers=headers)
data = response.json()

if data["estatus"] == "exitoso":
    print(data["datos"])
else:
    print(f"Error: {data['error']['mensaje']}")
const API_KEY = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

const url = new URL("https://nexus.cfdi4.com/api/consultas/fiel_estado/{rfc}?rfc=ABC010101ABC");
const response = await fetch(url, {
    headers: { "Authorization": `Bearer pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx` },
});
const data = await response.json();

if (data.estatus === "exitoso") {
    console.log(data.datos);
} else {
    console.error("Error:", data.error.mensaje);
}
<?php
// Requiere PHP 8.0+ con extension curl habilitada.

$API_KEY = 'pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx';

$ch = curl_init('https://nexus.cfdi4.com/api/consultas/fiel_estado/{rfc}');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPGET => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $API_KEY,
    ],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

if ($data['estatus'] === 'exitoso') {
    print_r($data['datos']);
} else {
    echo 'Error: ' . $data['error']['mensaje'];
}
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    apiKey := "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

    u, _ := url.Parse("https://nexus.cfdi4.com/api/consultas/fiel_estado/{rfc}")
    q := u.Query()
    q.Set("rfc", "ABC010101ABC")
    u.RawQuery = q.Encode()
    req, _ := http.NewRequest("GET", u.String(), nil)
    req.Header.Set("Authorization", "Bearer "+apiKey)

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Nexus {
    public static void main(String[] args) throws Exception {
        String apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://nexus.cfdi4.com/api/consultas/fiel_estado/{rfc}"))
            .header("Authorization", "Bearer " + apiKey)
            .GET()
            .build();
        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        var apiKey = "pk_live_RFCxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx";
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var response = await client.GetAsync("https://nexus.cfdi4.com/api/consultas/fiel_estado/{rfc}");
        var body = await response.Content.ReadAsStringAsync();
        Console.WriteLine(body);
    }
}

Ejemplo 200 OK

{
  "estatus": "exitoso",
  "datos": {
    "rfc": "ABC010101ABC",
    "isRegistered": false,
    "providerType": null,
    "keyName": null
  }
}

Codigos de error

404motor_error_404RFC no registrado.

Ejemplo de respuesta de error

{
  "estatus": "error",
  "error": {
    "codigo": "motor_error_404",
    "mensaje": "RFC no registrado."
  }
}