Errores
Formato RFC 9457 de los errores y la tabla de códigos estables.
Los errores siguen RFC 9457 (Content-Type: application/problem+json):
{
"type": "https://in.n1.app/developers?error=insufficient_scope",
"title": "Permiso (scope) insuficiente",
"status": 403,
"detail": "La clave de API no tiene el scope requerido: contacts:write.",
"instance": "/v1/companies/12/contacts",
"code": "insufficient_scope",
"request_id": "3f2b…",
"errors": [ { "loc": ["body", "email"], "msg": "…", "type": "…" } ]
}
errors solo aparece en errores de validación. Códigos estables:
| Código | Estado | Significado |
|---|---|---|
invalid_api_key | 401 | Falta la clave, el formato es incorrecto o el secreto no coincide. |
api_key_expired | 401 | La clave superó su fecha de vencimiento. |
api_key_revoked | 401 | La clave fue revocada desde el panel. |
feature_not_enabled | 403 | La cuenta no tiene habilitada la API pública. |
company_not_authorized | 403 | La clave no tiene acceso a la empresa o el usuario ya no es miembro. |
insufficient_scope | 403 | La clave no tiene el scope de la operación. |
insufficient_role | 403 | El rol del usuario en la empresa no alcanza el mínimo requerido. |
forbidden | 403 | Acceso denegado por otra razón; ver detail. |
validation_error | 400 / 422 | Parámetros, cuerpo o cursor inválidos; ver errors. |
not_found | 404 | El recurso no existe en esa empresa. |
file_not_available | 404 | El documento existe, pero N1 no tiene esa variante del archivo (o no pudo generarla). |
conflict | 409 | El estado actual del recurso impide la operación. |
idempotency_in_progress | 409 | Otra solicitud con el mismo Idempotency-Key sigue en curso. |
idempotency_key_reused | 422 | El Idempotency-Key ya se usó con otro método, ruta o cuerpo. |
export_not_ready | 422 | El documento no cumple los requisitos para causarse. |
rate_limited | 429 | Se superó el límite de solicitudes; ver Retry-After. |
internal_error | 500 | Error inesperado; incluye request_id al contactar soporte. |
http_error | otros | Cualquier otro estado HTTP no cubierto por los códigos anteriores. |
Todos los códigos son estables: puedes usarlos en tu lógica de reintentos. Los mensajes de title y detail están en español y pueden cambiar.