Llave y ambientes
Cada petición lleva tu llave en el encabezado X-Api-Key. La llave identifica tu cuenta y su ambiente: la de sandbox solo funciona en sandbox y la de producción solo en producción.
Dónde está tu llave
- Entra a tu cuenta del ambiente que vas a usar: sandbox-app.facturadigital.com.mx para pruebas o app.facturadigital.com.mx para producción.
- Ve a Configuración › API y desarrolladores.
- Copia la Llave vigente tal como aparece. Ya viene en el formato que espera el encabezado.
Esa pantalla también muestra la Llave anterior, el formato que usaban las integraciones viejas. Funciona hasta el 30 de junio de 2027; mientras la uses, cada respuesta trae el encabezado X-FD-ApiKey-Deprecation con la fecha de corte. Cambia tu integración a la llave vigente antes de esa fecha.
Cómo se manda
En el encabezado X-Api-Key de cada petición. No hay que firmar nada ni pedir un token antes. Las peticiones POST mandan su cuerpo como formulario (application/x-www-form-urlencoded), salvo stampxmlfile, que manda un archivo.
curl -sS "https://sandbox-app.facturadigital.com.mx/api/v5/account/balance" \
-H "X-Api-Key: $FD_API_KEY"const res = await fetch("https://sandbox-app.facturadigital.com.mx/api/v5/account/balance", {
headers: { "X-Api-Key": process.env.FD_API_KEY },
});$ch = curl_init('https://sandbox-app.facturadigital.com.mx/api/v5/account/balance');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Api-Key: ' . getenv('FD_API_KEY')]);requests.get("https://sandbox-app.facturadigital.com.mx/api/v5/account/balance",
headers={"X-Api-Key": os.environ["FD_API_KEY"]})Sandbox y producción
| Sandbox | Producción | |
|---|---|---|
| URL base | https://sandbox-app.facturadigital.com.mx/api/v5 | https://app.facturadigital.com.mx/api/v5 |
| Cuenta | Regístrate en sandbox | Regístrate en producción |
| Timbrado | Con un proveedor de pruebas; los CFDI no tienen validez fiscal ni llegan al SAT. | Válido ante el SAT. |
| Costo | Gratis. | Cada CFDI timbrado usa 1 folio. Cancelar no usa folio. |
Son dos cuentas aparte, con datos, folios y llaves propias. Lo que hagas en sandbox no toca tus CFDI de producción. Para pasar a producción cambias la URL base y la llave; el código es el mismo.
Si la llave no funciona
Todos estos casos responden HTTP 400 con code 501. El final del mensaje dice qué ambiente te respondió, por ejemplo [Environment: SANDBOX].
| message | Qué pasa |
|---|---|
Invalid X-API-Key. Please make sure you're passing the X-API-Key in the Header… | Falta el encabezado, la llave está incompleta o no existe en ese ambiente. Lo más común es usar la llave de producción contra sandbox o al revés: compara el ambiente del final del mensaje con el de tu llave. |
This API Key belongs to PRODUCTION and you are calling SANDBOX… | Tu llave vigente es de otro ambiente. Usa la de la cuenta del ambiente al que llamas. |
Your legacy API Key expired on 2027-07-01… | Usas la llave anterior después de su corte. Cámbiala por la llave vigente. |
Tu saldo de folios
/account/balanceResponde los folios disponibles de la cuenta de la llave. Es la petición más simple para comprobar que la llave y la URL son del mismo ambiente.
{
"message": "10 credits available.",
"balance": 10,
"code": 200
}Obtener la llave por API
/account/authorizeSi tu sistema necesita leer la llave sin entrar a la pantalla, account/authorize la regresa a cambio del usuario y la contraseña de la plataforma, en los encabezados API-USUARIO y API-PASSWORD. Úsalo solo desde tu servidor y por HTTPS: viaja la contraseña.
Respuesta 200
x_api_key_v2- La llave vigente. Es la que debes usar.
x_api_key- La llave anterior hasta su corte; después del corte regresa también la vigente.
account- Datos de la cuenta:
company,rfc,username,contact,email,activeylast_seen.
Con un usuario o contraseña incorrectos responde HTTP 401 con code 502. Después de varios intentos fallidos desde la misma IP responde HTTP 403 con code 503 hasta que pase el bloqueo.
Revisado contra la API v5 en producción el 2026-11-03.