Browse the Knowledge Hub211 resources
Postman review: pricing, alternatives and tutorial
Postman is an API platform built around a desktop and web request client. Requests are grouped into collections, parameterised with environments and checked by JavaScript scripts that run before and after each request. Collections run in CI through the Postman CLI. Postman 12 added a Git-native mode that stores collections as YAML files in your own repository.
QAble runs this tool on client engagements. The assessment below is from that experience.
- last reviewed
- 13 October 2026
- version covered
- Postman 12
- licence
- Freemium
At a glance
Postman at a glance
- Vendor
- Postman Inc.
- Category
- API testing
- Licence
- Freemium
- Platforms
- Windows, macOS, Linux, Web
- Languages
- JavaScript
- Integrates with
- Postman CLI, GitHub Actions, Git, OpenAPI, Newman (legacy)
- First released
- 2012
- Version reviewed
- Postman 12
Verdict
Our verdict on Postman
Strengths
- Nothing to configure before the first useful request, so exploration and debugging start in minutes
- Collections are the common currency for sharing APIs; most vendors and teams can import or export them
- Pre-request and post-response scripts use Chai assertions, so simple checks need no framework
- Postman 12 stores collections as per-request YAML files in Git, which makes review and branching practical
- The Postman CLI runs the same collection locally and in CI, with an official GitHub Action
- Mocks, monitors, documentation and environments live beside the requests rather than in separate tools
Weaknesses
- Free and Solo are single-user plans; any shared workspace means paid seats
- Newman cannot run v3 collections, so older pipelines need migrating to the Postman CLI
- JUnit, JSON and HTML reports are only available for v2.1 collections, not v3 YAML
- Script logic scattered across requests is hard to refactor and tends to be copied
- The CLI lacks OAuth 2.0 support and cannot send body files from the working directory
Best for
Exploring an unfamiliar API, sharing a working set of requests across developers, testers and support, and building a regression pack for an API quickly without a code framework. The collection is still the most common format for handing API knowledge from one person to another, and most vendors publish one. On our engagements it is the fastest way to get a new tester productive against a backend, and the Postman CLI turns the same collection into a CI gate with one command.
Not for
A large regression suite that has to live beside the application code, share its model classes and be refactored like code, where REST Assured, Karate or a test framework in the team’s own language does the job better. It is also the wrong place for load testing and for anything that needs real programming structure, such as complex data setup or contract checks against generated types.
Setup cost
Immediate for exploration: install the app, sign in and send a request. Setting it up properly for a team takes longer than people expect. Decide early whether collections live in Postman’s cloud or, from version 12, as YAML in your repository; agree a variable scope convention; keep secrets in the vault or CI secrets rather than in shared environments; and wire the Postman CLI into the pipeline. That is a few days of deliberate work, not an afternoon.
Maintenance burden
Moderate and rising with size. Test logic lives in script tabs spread across requests, folders and the collection, so shared helpers drift and get copied rather than reused. Cloud collections stored as large JSON documents were hard to review; version 12’s per-request YAML files diff far better, but only for teams that adopt Local View. Expect a migration task too: moving from Newman to the Postman CLI and from v2.1 collections to v3.
Honest limitations
Free and Solo are single-user plans, so any shared workspace means paying per user on Team or above. The Postman CLI cannot use OAuth 2.0 authorisation, cannot send request bodies from files in the local working directory, and runs gRPC and GraphQL collections only on paid plans. JSON, JUnit and HTML reports are produced only for v2.1 collections, not v3 YAML. Scripts have no real module system, so reuse at scale is awkward.
How it works
What is Postman and how does it work?
Collections, environments and variable scopes
A collection is a tree of folders and requests, each request carrying its URL, headers, body, authorisation and scripts. Values that change between runs are written as double-brace variables and resolved at send time from five scopes: global, collection, environment, iteration data and local. When a name exists in more than one scope, the narrowest wins, so a local variable set by a script beats the environment, which beats the collection. Most confusing failures in shared collections come from this: a stale global or collection value silently overriding what the environment was meant to supply. Secrets belong in the Postman Vault, read with pm.vault, rather than in environments that sync to a team workspace.
Scripts run in a sandbox around each request
Each request, folder and collection can carry a pre-request script and a post-response script, written in JavaScript and run in Postman’s sandbox rather than in Node.js. Scripts inherit down the tree, so a collection-level script runs for every request. Assertions use pm.test with pm.expect, which is Chai’s BDD syntax, plus helpers such as pm.response.to.have.status and jsonSchema checks. The sandbox explains both the convenience and the ceiling: there is no build step and nothing to install, but there is also no ordinary module system, so shared logic is copied between scripts, held in collection-level scripts, or published to a package library that the CLI can only use on paid plans.
Version 12: Local View, Cloud View and Collection v3
Postman 12, released in early 2026, connects a workspace to a Git repository on your machine. In Local View, edits are written as Collection v3 YAML files under a postman/ folder, one file per request rather than one large JSON document, and switching branches in Git switches what Postman shows. Cloud View is what consumers of the workspace see; local work reaches it when it is pushed, for example by postman workspace push in a pipeline after a merge. The change matters for testing because collections can finally be reviewed in a pull request, but it splits the world into v2.1 JSON and v3 YAML collections, and the tooling around them behaves differently.
The Postman CLI replaced Newman
Newman, the open source runner that put Postman collections into CI for a decade, is described in Postman’s own documentation as no longer maintained. It only understands v2.1 JSON and cannot run collections created or updated in Postman 12. Its replacement is the Postman CLI, a signed binary installed with npm or an install script and also bundled with the desktop app. postman collection run takes a file path or a collection ID: a local file runs without signing in, while a run by ID, or a local collection linked to the cloud, uploads results to Postman when you are signed in. Most Newman flags have direct equivalents, which keeps the migration mostly mechanical.
Strengths
What it does well
Exploration and debugging
The request builder, response viewer, console and history make Postman the quickest way to understand an API you did not write. Testers can reproduce a bug report, tweak a header and compare responses without writing code, which is why it remains the first tool most teams open when an endpoint misbehaves.
Data-driven collection runs
The Collection Runner and the CLI both iterate a collection over a CSV or JSON file, one iteration per row, with each column available as a variable. The CLI can also pull iteration rows from a dataset view. That covers boundary values, permission matrices and locale variations without duplicating requests, and the Collection Runner itself is unlimited on every plan.
Mock servers and monitors
Mock servers return saved example responses, so front-end and test work can start before an endpoint exists, and the CLI can run mocks locally. Monitors run a collection on a schedule from Postman’s infrastructure, which gives a cheap synthetic check on a staging or production API. Monitoring requests are metered per plan, so heavy schedules belong on a paid tier or in your own CI.
Pull-request review of API tests
With a workspace connected to Git, each request becomes its own YAML file, so a change to one assertion shows up as a small diff that a reviewer can read. Teams that previously treated collections as opaque exports can now apply branch protection, code owners and review rules to API tests in the same way as to application code.
Many protocols in one client
Beyond REST, Postman sends GraphQL, gRPC, WebSocket and other request types, and Collection v3 lets these sit together in one collection. For exploration this is genuinely useful. For automation, check the CLI first: it runs HTTP collections on every plan, gRPC and GraphQL collections only on paid plans, and other protocols not at all.
Pricing
Postman pricing and licensing
Postman is proprietary and sold per user. There is a free plan and a paid Solo plan, both for one person, a Team plan priced per user for collaboration, and Enterprise on a sales quote. Every plan includes the Collection Runner, the Postman CLI and mock servers; plans differ in collaboration, metered allowances such as monitoring requests, AI credits and Postman API calls, and governance features. Postman changes plans often, so check the pricing page before budgeting.
- Licence: proprietary software. The desktop app and the CLI are free to install, and there is no open source edition since Newman stopped being maintained.
- Free: one user, with the Collection Runner, CLI, mock servers and small monthly allowances, including 1,000 monitoring requests on the pricing page on 13 October 2026.
- Solo and Team: Solo raises limits for one person; Team adds shared workspaces for unlimited users. List prices on postman.com on 13 October 2026 were $9 a month for Solo and $19 per user a month for Team, both billed annually.
- Enterprise: contact sales. Adds organisation-wide governance and security controls, higher allowances and pooled AI usage; SSO is an add-on on Team.
- How cost scales: by seats first, then by metered usage such as monitoring, AI credits and cloud performance testing, which is billed per virtual user hour on paid plans.
- Hidden costs: the time to migrate Newman pipelines and v2.1 collections, and to keep script logic tidy as collections grow.
Checked against the vendor’s own pages on 13 October 2026. Pricing changes; confirm on the official site before buying.
Getting started
Postman tutorial: getting started
Setup, step by step
- Install the Postman desktop app, which also installs the Postman CLI, or install the CLI alone with npm.
- Create a collection, add a request and an environment holding baseUrl and any non-secret settings.
- Store tokens in the Postman Vault or pass them from CI, never in a shared environment.
- Write a post-response script with pm.test and run the collection in the Collection Runner.
- For Git storage, connect the workspace to your repository and edit in Local View.
- Run the collection from a terminal with postman collection run to confirm it passes outside the app.
Install
npm install -g postman-cli
# or, on macOS, Linux and WSL, use the official install script
curl -o- "https://dl-cli.pstmn.io/install/unix.sh" | sh
postman --versionA first example
// Post-response script on GET {{baseUrl}}/orders/{{orderId}}
pm.test('returns 200', () => {
pm.response.to.have.status(200)
})
pm.test('responds within 800 ms', () => {
pm.expect(pm.response.responseTime).to.be.below(800)
})
const order = pm.response.json()
pm.test('order has the expected shape', () => {
// pm.expect wraps Chai, so any Chai BDD assertion works here
pm.expect(order).to.include.keys('id', 'status', 'lines')
pm.expect(order.status).to.be.oneOf(['PENDING', 'PAID', 'SHIPPED'])
})
// Hand the id to the next request in the run. A local variable lives only
// for this run, so it never leaks into a shared environment.
pm.variables.set('orderId', order.id)What trips people up first
Variables that resolve to the wrong value. A request works in the app and fails in the CLI, or works for one tester and not another, because the value came from a global or collection variable on one machine and from the environment on another. Learn the scope order early: local beats iteration data, which beats environment, then collection, then global. Keep defaults at collection level, per-environment values in environments, run-time values in pm.variables, and pass secrets with --env-var in CI. The second hurdle is the CLI itself: a Newman command copied from an old tutorial will not run a v3 collection.
In practice
Using Postman in practice
Structuring a collection that lasts
Organise folders by resource or user journey, not by HTTP method, and keep each request independent enough to run alone after a setup folder. Put authorisation on the collection and let requests inherit it, so a token change is one edit. Put shared assertions, such as status class and response time, in a collection-level post-response script, and keep request-level scripts for checks specific to that endpoint. Name variables by scope and purpose, for example baseUrl in the environment and orderId set at run time, and never store a secret in an environment that syncs to a team workspace. If the team works in Git, adopt Local View from the start rather than migrating later: per-request YAML files make every change reviewable, and branches let a feature’s API tests travel with the feature. In our experience the single biggest maintainability win is deciding where logic lives before the collection has two hundred requests.
Chaining requests and testing negative paths
Most API regression packs are flows: create a resource, read it back, change it, delete it, and check that unauthorised and invalid requests fail the right way. Set the id from each response into a run-scoped variable and read it in the next request’s URL. For negative tests, duplicate the request into a folder named for the failure case and assert on the status and the error body, not only the status, because a 400 with the wrong message is still a defect. Use pm.execution.skipRequest in a pre-request script when a precondition is missing, rather than letting a later request fail with a confusing error.
// Pre-request script on PATCH {{baseUrl}}/orders/{{orderId}}
if (!pm.variables.get('orderId')) {
console.log('No orderId from the create step, skipping')
pm.execution.skipRequest()
}
// Post-response script on POST {{baseUrl}}/orders with an empty body
pm.test('rejects an order with no lines', () => {
pm.response.to.have.status(400)
const body = pm.response.json()
pm.expect(body.errors).to.be.an('array').that.is.not.empty
pm.expect(body.errors[0].field).to.eql('lines')
})Running collections in GitHub Actions
Postman publishes an official action, postmanlabs/postman-cli-action, which installs the CLI and runs whatever command you give it. A collection file in the repository runs without an API key; a run by collection ID, or one that should upload results to Postman, needs a key from a repository secret. Pass secrets as environment variables with --env-var rather than committing them in an environment file. One constraint shapes the pipeline: JUnit, JSON and HTML reporters work only for v2.1 JSON collections, while v3 YAML collections get the terminal report only. If your CI dashboard depends on JUnit XML, keep an exported v2.1 copy for the pipeline or rely on the run results uploaded to Postman.
# .github/workflows/api-tests.yml
name: api-tests
on: [push, pull_request]
jobs:
postman:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- name: Run the orders collection
uses: postmanlabs/postman-cli-action@v1
with:
# A v2.1 JSON export, so the JUnit reporter is available
command: >-
collection run tests/orders.postman_collection.json
-e tests/ci.postman_environment.json
--env-var "apiToken=${{ secrets.API_TOKEN }}"
-r cli,junit
--reporter-junit-export results/postman-junit.xml
- uses: actions/upload-artifact@v7
if: always()
with:
name: postman-results
path: results/Migrating from Newman and v2.1 collections
Treat the move to Postman 12 as two separate migrations. First, swap the runner: newman run becomes postman collection run, and -e, -g, -r and most other flags carry over, so most pipeline changes are a find and replace followed by a test run. Second, decide whether to convert collections to v3 with postman collection migrate. Converting gives you per-request YAML and Git review, but loses the JUnit, JSON and HTML reporters in the CLI and cuts off any remaining Newman jobs. Migrate one collection end to end, including CI and reporting, before converting the rest, and keep backups of the v2.1 exports until every consumer has moved.
Keeping a large collection healthy
Review collections the way you review code. Search regularly for duplicated script blocks and move them up to the folder or collection level. Delete requests nobody runs. Keep assertions specific: checking that a field exists catches less than checking its type and allowed values, and a JSON schema check catches drift in fields nobody thought to assert. Watch for tests that depend on data created by a previous run, which pass on the author’s machine and fail in CI. Finally, be honest about when a collection has outgrown the tool: if the pack needs a page of helper functions, typed models and generated data, a code-based framework will cost less to maintain than the scripts.
Pitfalls
Common pitfalls
Copying Newman commands into a Postman 12 pipeline
Why it happens: Years of tutorials use newman run. Postman’s docs now describe Newman as no longer maintained, and it cannot run v3 collections or anything created or updated in Postman 12.
The fix: Install the Postman CLI and replace newman run with postman collection run; most flags map directly. Convert collections with postman collection migrate only when the pipeline is ready for v3.
Losing JUnit reports after converting to v3
Why it happens: The CLI’s JSON, JUnit and HTML reporters are available only for v2.1 JSON collections. A v3 YAML collection produces the terminal report alone, so the CI test report silently disappears.
The fix: Check reporting before converting. Keep a v2.1 export for the pipeline, or sign the CLI in so run results are uploaded to Postman and linked from the job log.
Secrets committed in environments or exports
Why it happens: Environments are convenient, so tokens end up in them, then in a team workspace, an exported file or, from version 12, a YAML file in Git.
The fix: Keep secrets in the Postman Vault for local work and in CI secrets for pipelines, passed with --env-var. Review postman/ diffs for credentials as you would application config.
A global or collection variable overriding the environment
Why it happens: Postman resolves the narrowest scope first, then environment, collection and global. A leftover value in a broader or narrower scope wins on one machine and not another.
The fix: Agree which scope owns each variable, clear globals in shared collections, and print resolved values with console.log in the Postman console when a run behaves differently.
CI runs that fail on OAuth 2.0 or uploaded files
Why it happens: The Postman CLI does not support OAuth 2.0 authorisation and cannot send request bodies from files in the local working directory, both of which work in the app.
The fix: Fetch the token in a pre-request script or a CI step and pass it as a variable. Upload test data files to Postman as the docs describe, or keep file uploads out of the CLI suite.
Assuming the free plan covers a team
Why it happens: Free and Solo are single-user plans. Teams that relied on free collaboration in the past find shared workspaces need the Team plan.
The fix: Budget per-user seats for everyone who edits shared collections, or keep collections in Git with Local View so reviewers outside Postman can still read them.
Compared
Postman alternatives compared
| Tool | Where collections live | Test scripting | CI runner | Licence | Free use by a team |
|---|---|---|---|---|---|
| Postman | Postman cloud, or v3 YAML in Git | JavaScript pm API with Chai | Postman CLI | Proprietary, freemium | No: Free and Solo are single-user |
| Insomnia | Local, Insomnia cloud or Git Sync YAML | JavaScript insomnia object, Chai-style expect | Inso CLI | Apache 2.0 app, paid cloud plans | Git Sync free for up to 3 users |
| Bruno | Plain text files in your repository | JavaScript bru API with Chai | Bruno CLI, bru run | MIT, paid Pro and Ultimate editions | Yes; private Git in the app is paid |
| REST Assured | Java test code in your repository | Java with Hamcrest matchers | Maven or Gradle test run | Apache 2.0 | Yes, no accounts involved |
FAQ
Frequently asked questions
What is Postman?
Postman is an API platform built around a desktop and web request client. Requests are grouped into collections, parameterised with environments and checked by JavaScript scripts that run before and after each request. Collections run in CI through the Postman CLI. Postman 12 added a Git-native mode that stores collections as YAML files in your own repository.
What are the best Postman alternatives?
The alternatives most often weighed against Postman are Insomnia, Bruno, REST Assured and Karate. The comparison on this page sets them side by side on where collections live, test scripting, ci runner, licence and free use by a team, and the verdict above says where Postman is the wrong choice and which of them to pick instead.
Is Postman free?
Postman has a free plan for one user that includes the request client, Collection Runner, Postman CLI and mock servers, with small monthly allowances for monitoring and AI features. Collaboration in shared workspaces needs the Team plan, priced per user, and Enterprise is quoted by sales. Solo is a paid plan for one person with higher limits. The software is proprietary, so there is no self-built free edition beyond the free plan.
Is Newman still supported?
Postman’s documentation describes Newman as no longer maintained. It runs only v2.1 JSON collections and cannot run collections created or updated in Postman 12. The Postman CLI is the replacement: postman collection run accepts the same core options, including -e for environments, -g for globals and -r for reporters, and adds support for v3 collections, monitors and mocks. Existing Newman pipelines keep working only as long as their collections stay in v2.1 format.
What changed in Postman 12?
Postman 12 made the product Git-native. A workspace can connect to a local repository, and edits in Local View are stored as Collection v3 YAML files under a postman/ folder, one per request, so they can be branched, diffed and reviewed. Cloud View shows what has been published to the workspace. The release also introduced Agent Mode, an AI assistant that can edit collections, tests and mocks, and it moved command-line runs from Newman to the Postman CLI.
Postman or REST Assured for API test automation?
Use Postman when the people writing tests are not Java developers, when speed of exploration matters, or when the same collection doubles as shared documentation. Use REST Assured when the suite must live with the service’s code, reuse its model classes, run in the same build and be refactored like code. Many teams use both: Postman for exploration and smoke checks, and a code-based suite for the deep regression layer.
Can Postman do load testing?
Postman has a performance testing feature that drives virtual users against a collection, the CLI has a beta command for performance runs, and cloud runs are billed per virtual user hour on paid plans. It suits a quick check that an endpoint holds up under modest concurrency. For capacity planning, soak tests or detailed latency analysis, a dedicated tool such as k6, Gatling or JMeter gives more control over load shape and better metrics.
Can Postman collections be stored in Git?
Yes, and since Postman 12 it is a first-class workflow. Connect the workspace to your repository and work in Local View; collections and environments are written as YAML files under postman/, and switching Git branches changes what the app shows. Before version 12, the usual approach was exporting JSON files, which diffed poorly. Note that Newman cannot run the v3 YAML format, so pipelines need the Postman CLI.
Is Postman still worth learning in 2026?
Yes. Postman remains the most common way teams share and explore APIs, and its collection format is understood by many other tools, including Insomnia and Bruno, which import Postman collections. Learning it well means learning variable scopes, scripts and the CLI, not just sending requests. Pair it with a code-based API framework if you work on a large regression suite, since the two cover different needs.
Alternatives
Postman alternatives worth weighing
REST Assured
Java DSL for API testing, with a fluent given-when-then syntax and deep JSON and XML assertion support.
Insomnia
Open source API client supporting REST, GraphQL, gRPC and WebSockets, with a lighter footprint than Postman.
Bruno
Git-native API client storing collections as plain text files in your repository, with no cloud account.
Karate
API testing framework with its own DSL, requiring no Java knowledge and bundling mocks and performance testing.
Hoppscotch
Lightweight browser-based API client, self-hostable, covering REST, GraphQL and real-time protocols.
Resources
Where to go next
Keep going
Prepare, or get it done
Picking the wrong tool costs more than picking late.
QAble advises on toolchain decisions and then implements them, with engineers who have run these tools on real delivery. Start with a free QA audit.