Ejemplo en JAVASCRIPT
Ejemplo de uso del API SAT en javascript.
Archivo fuente: nodejs.js
#!/usr/bin/env node
/**
* Ejemplo Node.js — POST /api/v1/usuario/datos-fiscales
* Usa fetch nativo (Node 18+).
*
* Uso:
* export SAT_API_KEY="sat_xxxxxxxxxxxx"
* node nodejs.js [RFC]
*/
class SatApiClient {
constructor(apiKey, baseUrl = 039;https://api.cfdi4.com039;, userAgent = 039;nodejs-sat-api/1.0039;) {
this.apiKey = apiKey;
this.baseUrl = baseUrl.replace(/\/$/, 039;039;);
this.userAgent = userAgent;
}
async _post(endpoint, body) {
const url = `${this.baseUrl}${endpoint}`;
try {
const r = await fetch(url, {
method: 039;POST039;,
headers: {
039;Authorization039;: `Bearer ${this.apiKey}`,
039;User-Agent039;: this.userAgent,
039;Content-Type039;: 039;application/json039;,
},
body: JSON.stringify(body),
});
if (!r.ok) {
// Status HTTP no 2xx, pero leemos el body igual
const data = await r.json().catch(() => ({}));
return data.body || { cfdi_codigo: 4001, cfdi_texto: `HTTP ${r.status}` };
}
const data = await r.json();
return data.body || {};
} catch (err) {
if (err.name === 039;AbortError039;) {
return { cfdi_codigo: 3001, cfdi_texto: 039;Timeout039; };
}
return { cfdi_codigo: 5001, cfdi_texto: err.message };
}
}
datosFiscales(rfc) {
return this._post(039;/api/v1/usuario/datos-fiscales039;, { rfc: rfc.toUpperCase().trim() });
}
opinionCumplimiento(rfc) {
return this._post(039;/api/v1/sat/opinion-cumplimiento039;, { rfc: rfc.toUpperCase().trim() });
}
csf(rfc) {
return this._post(039;/api/v1/sat/constancia-situacion-fiscal039;, { rfc: rfc.toUpperCase().trim() });
}
}
async function main() {
const apiKey = process.env.SAT_API_KEY;
if (!apiKey) {
console.error(039;ERROR: configura la variable de entorno SAT_API_KEY039;);
console.error(039; export SAT_API_KEY="sat_xxxxxxxxxxxx"039;);
process.exit(1);
}
const rfc = process.argv[2] || 039;XAXX010101000039;;
const client = new SatApiClient(apiKey);
console.log(`Consultando datos fiscales de RFC: ${rfc}\n`);
const result = await client.datosFiscales(rfc);
console.log(` Código: ${result.cfdi_codigo || 0}`);
console.log(` Texto: ${result.cfdi_texto || 039;039;}`);
console.log(` Detalle: ${result.cfdi_descripcion || 039;039;}`);
console.log(` Saldo: ${result.saldo || 0} créditos`);
if (result.cfdi_codigo === 1 && result.data) {
console.log(`\n Datos fiscales:`);
console.log(` ${JSON.stringify(result.data, null, 2)}`);
} else if (result.cfdi_codigo === 1004) {
console.log(039;\n ⚠️ Saldo insuficiente. Recarga en https://panel.cfdi4.com/saldos039;);
} else if (result.cfdi_codigo === 1001) {
console.log(039;\n ⚠️ API key inválida. Verifica la variable SAT_API_KEY039;);
}
process.exit(result.cfdi_codigo === 1 ? 0 : 1);
}
main().catch((err) => {
console.error(039;Error fatal:039;, err);
process.exit(1);
});