Guia de Bruno
Cliente offline-first. Tus collections se guardan en archivos .bru en tu disco, no en la nube. Privacidad total.
Bruno es un cliente de APIs offline-first. Esto significa que tus collections NO viven en la nube de Bruno: viven como archivos .bru en tu computadora, dentro de una carpeta que tu controlas (por defecto ~/Bruno en Mac/Linux).
¿Por que importa? 1) Privacidad: tu API key nunca sale de tu maquina, ni siquiera va a los servidores de Bruno. 2) Git-friendly: puedes commitear las collections a git y versionarlas con tu codigo. 3) Sin login: no necesitas cuenta.
Bruno es la opcion favorita de equipos que trabajan con datos sensibles o que quieren tratar las collections como codigo. Lo mantiene un developer indio (Aniket Singh) y esta ganando adopcion rapida en 2024-2026.
Conceptos que necesitas saber
Archivo .bru
El formato de archivo de Bruno. Es texto plano con una sintaxis similar a YAML. Puedes abrirlo en cualquier editor y hacer git diff. Ejemplo: GET {"url": "https://api.ejemplo.com"}.
Collection
Una carpeta con archivos .bru (uno por peticion). Se guarda en disco como una carpeta normal.
Environment
Como en Postman: variables reutilizables. Pero aqui se guardan como archivos .env (formato KEY=VALUE) en una subcarpeta environments/.
Offline-first
Filosofia de diseno: la app funciona 100% sin internet. La primera vez descarga la spec OpenAPI y la guarda; las siguientes veces no necesita red.
Git-friendly
Puedes hacer git add . && git commit con tus collections. Otros devs hacen git pull y tienen las mismas peticiones, environments y tests.
Paso a paso
-
1
Que hace diferente a Bruno
A diferencia de Postman/Insomnia, Bruno no usa "workspaces en la nube". Todo vive en tu disco. Es perfecto para: developers que valoran privacidad, equipos que versionan collections en git, gente que no quiere crear cuenta.
-
2
Ve a usebruno.com/downloads
https://www.usebruno.com/downloads. Veras: Windows (.exe), Mac (.dmg), Linux (.deb, .rpm, AppImage). Bruno es un proyecto open source con ~30k stars en GitHub.
-
3
Instala Bruno
Windows: ejecuta el .exe, sigue el wizard (Next, Next, Install). Mac: arrastra al Applications. Linux: sudo dpkg -i Bruno_x.x.x.deb o equivalente.
-
4
Abre Bruno y familiarizate con la UI
La primera vez veras una pantalla de bienvenida. Click en "Skip" o "Get Started". La UI tiene 3 areas: sidebar (collections), centro (editor de peticion), abajo (respuesta).
-
5
Click en el icono de folder "+" en el sidebar para crear una collection
Te preguntara donde guardarla. Por defecto ~/Bruno. Crea una subcarpeta llamada "SAT API". Las collections en Bruno son carpetas reales en tu sistema de archivos.
-
6
Click derecho sobre la collection "SAT API" > "Import Collection"
Veras opciones: "From File", "From URL", "From Postman", "From Insomnia". Elige "From URL" para importar directo desde la spec.
-
7
Pega https://api.cfdi4.com/docs/postman-spec y click "Import"
Bruno descarga el JSON de la coleccion Postman, lo convierte a su formato nativo .bru, y crea los 33 archivos en tu carpeta. Toma unos segundos.
-
8
Crea un Environment (icono de llave inglesa > Environments)
Un environment es donde guardas variables como api_key. En Bruno, los environments son archivos .env dentro de environments/ dentro de tu collection.
-
9
Crea un archivo "Produccion.env" con este contenido
Abre un editor de texto (VSCode, Notepad, nano) y crea el archivo ~/Bruno/SAT API/environments/Produccion.env con: api_key=sat_xxxxxxxxxxxxxxxxxxxx (reemplaza con tu API key real). Guarda y cierra.
-
10
En Bruno, click en el dropdown de environment (esquina superior derecha) y selecciona "Produccion"
A partir de ahora, todas las peticiones de esta collection usaran las variables del archivo Produccion.env.
-
11
Abre cualquier peticion de la collection
Por ejemplo "Datos fiscales > POST datos-fiscales". Veras la peticion en lenguaje .bru: meta { name: "..." } + post { url: "..." } + headers { Authorization: "Bearer {{api_key}}" }.
-
12
Verifica que el header Authorization usa la variable {{api_key}}
Si ves {{api_key}} (con dobles llaves), significa que se sustituye automaticamente por el valor del environment. Si ves un valor hardcodeado, editalo para que use la variable.
-
13
Click "Send"
La respuesta aparece abajo. Veras: status (200/404/etc), tiempo, tamano, headers de respuesta, y body JSON con syntax highlighting.
-
14
Para ver el JSON formateado bonito, click en "Preview" abajo
Bruno tiene 2 vistas: "Raw" (texto plano) y "Preview" (tree view colapsable). Preview es ideal para JSONs grandes.
-
15
Para commitear la collection a git, abre una terminal en la carpeta de la collection
cd ~/Bruno/SAT\ API (o la ruta donde la guardaste). Inicializa git: git init. Crea .gitignore que ignore environments/*.env (porque tienen secrets). Despues: git add . && git commit -m "SAT API collection".
-
16
Para compartir con tu equipo, sube a un repo de GitHub/GitLab
Cuando alguien clone el repo, abre Bruno, va a "Open Collection", elige la carpeta, y ya tiene todo listo. Crea su propio archivo .env con su API key. Cero friccion.
Verificar que funciona
Si todo salio bien, deberias ver una respuesta JSON con cfdi_codigo: 1. Si ves error 401, revisa que tu API key este bien copiada (sin espacios al inicio/final).
{
"cfdi_codigo": 1,
"cfdi_texto": "OK",
"data": { ... }
}
Problemas comunes
Error 401: Unauthorized
Tu API key no es valida o no la pusiste bien. Revisa que: 1) Empiece con sat_, 2) No tenga espacios, 3) El RFC este activo en el panel.
Error 403: Forbidden
Tu user-agent es muy generico. Anade -H \"User-Agent: MiApp/1.0\" a tu peticion.
Error 429: Too many requests
Superaste el rate limit (60 req/min). Espera 60 segundos.
Error 500: Internal server error
El upstream del SAT esta teniendo problemas. Reintenta en unos minutos. Si persiste, contactanos.
Error 503: Service unavailable
El sistema esta en mantenimiento. Revisa panel.cfdi4.com para avisos.
No me aparece la coleccion al importar
Asegurate de usar la URL exacta. Algunos clientes requieren la spec OpenAPI, otros la coleccion Postman. Revisa el paso correspondiente.