Applies to Bruno 3.0 and later
At some point, there's usually a need to share your API collection. A teammate needs the requests/scripts you built, QA wants your test suite, or a partner wants to try your API without digging through reference docs. How you hand that work over decides whether everyone stays on the same version or ends up with three different copies.
Bruno gives you several ways to share: Git repositories, one-click Fetch in Bruno buttons, collection and workspace exports, and imports from other tools. This guide covers when to use each one, how to do it step by step, and how to keep secrets out of everything you share, so it's done securely.
The best way to share Bruno collections with a team is Git. Bruno saves every collection as plain YAML files, so you commit them to a repository and teammates clone it, pull updates, and review changes in pull requests. When someone only needs a one-time copy or uses a different tool, export the collection as a Bruno Collection, Postman Collection, or OpenAPI Specification. Variables marked as secret are never included in exports.
| Method | Best for | Stays in sync? | Recipient needs |
|---|---|---|---|
| Git repositoryRecommended | Teams editing the same collections day to day | Yes, through pull | Bruno and repo access |
| Fetch in Bruno button | Collections linked from docs, READMEs, or onboarding guides | Yes, it clones a Git-synced copy | Bruno and repo access |
| Workspace export (ZIP) | Handing over several collections plus global environments | No, it's a snapshot | Bruno |
| Bruno Collection export | One-off copies and backups | No | Bruno |
| Postman Collection export | Colleagues who haven't moved to Bruno yet | No | Postman or a compatible tool |
| OpenAPI export | Sharing the API contract with docs, gateways, or code generators | No | Any OpenAPI tool |
| Environment export (JSON) | Sharing variable sets on their own | No | Bruno |
The rule of thumb: if the other person will edit the collection and you want their changes back, use Git. If they only need a copy, export it.
We built Bruno as an open-source, local-first API client. Instead of syncing your work to our servers or cloud, Bruno saves each collection as a folder of files on your machine. Since Bruno 3.0, those files use YAML that follows the OpenCollection specification, an open format we created so your collections are never locked to a single tool. Each request is its own .yml file, each folder is a real directory, and environments sit in an environments/ folder:
payments-api/
├── opencollection.yml # collection settings
├── environments/
│ ├── local.yml # one file per environment
│ └── staging.yml
├── orders/
│ ├── folder.yml # folder settings
│ ├── create-order.yml # one file per request
│ └── list-orders.yml
└── refunds/
└── create-refund.yml
Because the collection is plain text, anything that works with files works with your collection. Git can version it, reviewers can read it in a pull request, you can open it in your IDE, and your backup tool can back it up. There is no proprietary sync layer between you and your data.
Git is the way we recommend sharing collections. You get full history, branches, pull requests, and one source of truth, on whichever provider your team already uses: GitHub, GitLab, Bitbucket, or Azure DevOps. Our Git collaboration docs cover setup for each provider.
Decide where the repository lives before you initialize anything. Bruno supports three strategies:
If your workspace already has Git, don't run git init inside a collection folder to split it out. Use Connect to Git instead so the two repositories don't collide.
For a full comparison with a decision guide, read our guide, How to Use Git in Bruno: Collection, Workspace, and Hybrid Setup. For repository layouts at scale, see Structuring Git for API Collection Collaboration.
Since Bruno 3.0, the free edition's Git UI can initialize a repository, show text and visual diffs, fetch, pull, and clone. Connecting remotes, committing, pushing, branching, stashing, and resolving merge conflicts inside the app require Pro or Ultimate (give it a try with a free trial). Because a collection is an ordinary folder, free users can do all of those with the terminal or any Git client.
Set up your .gitignore before the first commit (see the secrets section below) so local credentials never enter your history. Then:
# Start tracking the collection
$ cd path/to/payments-api
$ git init
# Save the first snapshot
$ git add .
$ git commit -m "Add payments API collection"
# Connect a remote and push
$ git branch -M main
$ git remote add origin <your-repository-url>
$ git push -u origin main
Recipients don't need the command line. In Bruno, they click Import Collection (on the home screen or from the + menu), choose the Git repository option, paste the repository URL, and pick where to save it. Bruno clones the repo, lists the collections it finds, and opens the one they select, still connected to Git.
To pick up new changes later, they open the Git UI, click Fetch to see what's incoming, then click Pull. Both are available in the free edition. If you shared a whole workspace, teammates use Import workspace > Clone from Git Repository instead, which brings over the full Git history.
Since every request is a small YAML file, a change shows up as a readable diff. When someone moves an endpoint to a new API version, the pull request shows exactly that:
http: method: GET- url: '/v1/orders'+ url: '/v2/orders'Reviewers can comment on it the same way they review application code. Bruno's Git UI shows the same changes as text or visual diffs, and on Pro and Ultimate the History tab on any request lists every commit that touched it, with author, date, and message.
Sometimes the audience is broader than your team: users of a public API, readers of your docs, or new hires following an onboarding guide. The Fetch in Bruno button turns cloning into a single click. Anyone who clicks it is prompted to open Bruno, chooses a save location, and gets a Git-synced copy, so they can pull your future updates.
To generate a button:
... menu, select Share, go to the Embed tab, and copy the HTML or Markdown snippet...., select Export, and copy the snippet from the Embed tab.The collection or workspace must already be initialized with Git and pushed to a repository your audience can access. The Markdown version looks like this (swap in your own repository URL):
[](https://fetch.usebruno.com?url=https://github.com/your-org/your-collection.git)The button also works with OpenAPI specs: point url at a spec file and add &type=openapi, and Bruno converts the spec into a collection on the reader's machine. To see the flow from the recipient's side, clone our GitHub REST API collection into Bruno.
Exports create a standalone copy. To export:
... menu.Which format to choose depends on who's receiving it:
Whatever format you pick, secret variables are left out of the exported file.
A Bruno workspace groups multiple collections together with global environment variables and workspace-level settings. When you need to hand over everything at once, such as onboarding a contractor or moving to a new laptop, export the workspace:
... menu at the top..zip file containing all collections and configuration.To import it, go to the Workspace section, choose Import workspace, select From ZIP File, pick the file, and choose a destination folder. A ZIP is a snapshot. If the workspace should stay in sync, choose Clone from Git Repository in the same dialog instead. Full steps are in the workspace import and export docs.
Sharing works both ways. When someone sends you a collection, click Import Collection on the home screen or from the + menu and pick the matching format:
| Source | What to import | Good to know |
|---|---|---|
| Bruno | The collection folder | For collections shared by a colleague or restored from a backup |
| Postman | Exported collection .json |
Our Postman to Bruno migration guide also covers scripts and environments |
| Postman data export | Full account export | Brings collections, environments, and globals over in one go (Ultimate edition) |
| Insomnia | .json (v4) or .yaml (v5 and later) |
Both export formats are supported |
| Git repository | Repository URL | The collection stays connected to Git |
| OpenAPI | .json or .yaml file, or a URL |
Supports OpenAPI 2.0 (Swagger) and 3.x, and generates a request for each endpoint |
| WSDL | .wsdl file |
For SOAP web services |
Got a curl command instead of a collection? That comes in through a new request rather than the import dialog: click ... on your collection, choose New Request, set the request type to From cURL, and paste. It works in reverse too. Generate Code on any request turns it back into curl, which is often the quickest way to share a single request with someone who doesn't use Bruno. Swap real tokens for variables first, since the generated command includes whatever the request contains. Our guide to importing curl commands into Bruno covers exactly which curl flags carry over.
After importing, review the requests, set up your environments, and configure authentication before sending anything. The full list of options is in the import docs.
Environments hold base URLs, tokens, and API keys, which makes them the riskiest part of any shared collection. Bruno gives you three ways to share the shape of an environment without the sensitive values. For a deeper look at keeping credentials safe, see our guide to managing secrets in Bruno.
To share variables on their own, open the Environments section in the top right, click Configure, and use Export. Select the environments you want and Bruno saves them as a JSON file. On the receiving side, Import in the same screen accepts both Bruno and Postman environment files, for collection and global environments alike. See importing and exporting environments.
Tick the secret checkbox on any variable and Bruno stores its value on your machine, encrypted with your operating system's encryption where available and AES-256 otherwise. The value is never written to the environment file, so you can commit the collection safely, and it is excluded from collection and environment exports. Starting with Bruno 4.0, secret variables appear in their own tab.
For teams that already manage secrets in .env files, Bruno reads a .env file at the root of the collection folder:
API_KEY=your_api_key_value
JWT_TOKEN=your_jwt_token_value
In your environment, set the variable's value to . The environment file you commit then contains only the reference, never the key itself:
name: staging
variables:
- name: baseUrl
value: https://staging.example.com
- name: apiKey
value: ''
Add the .env file to your .gitignore so it never reaches the repository:
# Local secrets
.env
Then commit a .env.sample file with the same keys and empty values, so teammates know exactly what to fill in:
API_KEY=
JWT_TOKEN=
Since Bruno 3.1, you can also manage workspace-wide credentials from Workspace > Global Environment without editing a .env file by hand, and reference them from any collection in the workspace. For organization-wide secrets, Bruno integrates with secret managers including HashiCorp Vault, AWS Secrets Manager, Azure Key Vault, and Google Cloud Secret Manager.
.env..env is in .gitignore, and a .env.sample with placeholders is committed. instead of hardcoded hosts, so recipients can point them at their own environment. Our guide on how to manage variables in Bruno walks through the setup.Use Git. Bruno stores collections as plain YAML files, so you can commit a collection to a repository on GitHub, GitLab, Bitbucket, or Azure DevOps just like you would with code. Teammates clone it into Bruno, pull updates as they land, and review changes in pull requests, which keeps everyone on the same version.
Yes. Open the collection's three-dot menu, choose Share, and export it as a Postman Collection. Your colleague can import the resulting JSON file into Postman. If they later switch to Bruno, they can import Postman collections and environments straight back in.
Not if you mark them as secret. Bruno stores secret variable values encrypted on your machine, never writes them to environment files, and leaves them out of collection and environment exports. Values kept in a .env file stay local as long as the file is listed in .gitignore.
No. Since Bruno 3.0, the free edition's Git UI can initialize repositories, show diffs, fetch, pull, and clone. Committing, pushing, branching, and resolving merge conflicts inside the app require Pro or Ultimate, but free users can do all of those with the terminal or any Git client.
A collection export packages one collection in Bruno, Postman, or OpenAPI format. A workspace export produces a ZIP file containing every collection in the workspace plus global environments and workspace settings. Both are snapshots, so use Git if you need the copies to stay in sync. You can sync either the collection or the workspace.
Bruno imports Bruno collections, Postman collections, Insomnia exports (JSON from v4, YAML from v5 and later), OpenAPI 2.0 and 3.x specs from a file or URL, WSDL files for SOAP services, and collections cloned from Git repositories. The Ultimate edition can also import a full Postman data export.
Git keeps everyone on the same version and gives API changes a real review process. Fetch in Bruno buttons put a collection one click away for anyone reading your docs. Exports and imports cover everything else, from Postman handoffs to OpenAPI contracts, while secret variables and .env files keep credentials on the machines they belong to.
Push your first collection to a repository, then add a Fetch in Bruno button to your README.
Download BrunoChoosing a repo layout? How to Use Git in Bruno compares all three strategies.