Manejar errores y reintentos
Todos los errores siguen RFC 9457 y el campo type es un enlace deep al diccionario de errores.
Patrón recomendado
resp = requests.post(...)
if resp.status_code >= 400:
problem = resp.json()
print("Error:", problem["type"], problem["title"])
print("Correlation:", problem.get("correlationId"))
if problem.get("dgii"):
print("DGII code:", problem["dgii"]["code"], "track:", problem["dgii"].get("trackId"))
# Decide reintento según problem["type"]:
if problem["type"].endswith("/dgii-unavailable"):
# ERPly Pro ya reintentará — registra y sal.
return
if problem["type"].endswith("/validation-error"):
raise ValueError(problem["detail"])
Reintentos seguros
POST /v1/invoiceses idempotente víaIdempotency-Keycon TTL de 24 h. Reusar la misma clave devuelve el resultado original con HTTP 200 (en vez de 202).dgii-unavailable(504) → ERPly Pro reintenta solo. No hace falta hacer nada.dgii-rejected(422) → NO reintentes con el mismo eNCF; ese número ya quedó consumido.
Errores frecuentes
| Tipo | Acción |
|---|---|
validation-error | Corrige el payload. |
mathematical-discrepancy | Re-calcula totales con redondeo correcto. |
dgii-rejected | Lee dgii.code y consulta el diccionario. |
dgii-unavailable | Espera al webhook. |
¡Listo! Has emitido tu primera factura. Continúa con los conceptos o el reference completo.