The postman collections vs openapi spec question comes up every time a team grows past a handful of engineers. You open the collection you wrote six months ago and find it describes an endpoint that now has three extra required fields, two deprecated parameters, and a response shape that no longer matches what the server actually returns. The OpenAPI spec in Git says something different. Your Swagger UI says something else. Nobody is sure which one is right.
That drift is not a tooling failure. It is a workflow failure, and the distinction matters. Postman is an excellent tool for request execution, scripting, and exploratory testing. The problem is when teams treat the collection as the API contract itself, rather than as one artifact derived from that contract.
Why collections drift in the first place
A Postman collection is a request-first artifact. You fire a request, observe the response, and save it. Over time you add pre-request scripts, variable substitutions, test assertions, and folder structures that mirror how your team thinks about the API, not necessarily what the API formally specifies.
Your OpenAPI spec, by contrast, is a contract-first artifact. It declares paths, parameters, schemas, and response types in a machine-readable format that tooling can validate, mock, and generate code from.

The two artifacts answer different questions. The collection answers “how do I call this endpoint today?” The spec answers “what is this API supposed to do?” When teams maintain both independently, they inevitably diverge. One developer updates the spec when merging a pull request. Another updates the collection when they notice a test is broken. Nobody merges them. Within a few months you have two partially accurate descriptions of the same API, and no reliable way to tell which is more current.
The customer evidence for this pattern is concrete. Inventis Korea reported exactly this problem: their team built an API, generated an OpenAPI spec for Swagger, imported the collection to Postman for testing, and then spent ongoing effort keeping three representations in sync. Tests missed edge cases because the collection did not reflect the full schema. Documentation drifted because the spec was not the input to test creation. These are not edge cases; they are predictable outcomes of a request-first workflow at scale.
The root cause: Postman is not designed to be a spec store
Postman collections have their own format. The Postman collection schema is a proprietary JSON structure that describes requests, scripts, and folder hierarchies. It is not OpenAPI. Postman can import and export OpenAPI, but conversion is lossy in both directions: OpenAPI-to-collection drops schema details that are not expressible as requests; collection-to-OpenAPI drops scripts and data that are not expressible as spec fields.
This is not a criticism of Postman. It is a description of what the tool is actually for. Postman is a request runner with collaboration features built around the request-centric model. Using it as your canonical API description requires you to impose structure the format was not designed to carry.
Compare the two representations for a single endpoint:
| Property | Postman collection | OpenAPI spec |
|---|---|---|
| Request parameters | Stored as key-value pairs with optional description | Typed, validated, with required and schema fields |
| Response shape | Captured as a saved example (optional) | Defined as a JSON Schema with $ref reuse across paths |
| Error responses | Added manually per request | Enumerated in responses with shared components/schemas |
| Schema reuse | None; copy-paste between requests | $ref to components/schemas enforced by validators |
| Machine-readable contract | No | Yes; tooling can generate servers, clients, mocks |
| Git diff-friendly | JSON with opaque IDs; hard to review meaningfully | YAML; meaningful line-level diffs |
| Lint and validate | Not in native format | Spectral, Redocly CLI, and others |
The table shows why drift happens: the collection cannot fully express the contract, so the contract lives elsewhere, and the two fall out of sync as soon as someone edits one without the other.
What spec-first actually means for a Postman team
Spec-first does not mean “design everything in YAML before writing any code.” For most teams migrating from a collection-centric workflow, it means inverting the dependency. The spec-first methodology puts the OpenAPI document in Git as the authoritative description of the API. Every other artifact, including the collection you use for testing, is derived from that document, not the other way around.

In practice the workflow looks like this:
- The spec is committed to Git and reviewed as part of the PR process.
- Tests, mocks, and documentation are generated from the spec.
- When the API changes, the spec changes first. Downstream artifacts update automatically or via tooling.
- The collection your team uses for exploratory testing is generated from the spec, so it always reflects the current contract.
The collection is still there. Your scripts, data-driven tests, and environment variables are still there. The difference is that the collection is downstream of the spec, not upstream of it. When a new field appears in the spec, it appears in the generated collection. When a field is removed from the spec, the test fails because the generated request no longer includes it. Drift becomes a CI failure, not a discovery six months later.
How to generate collections from your spec
There are several ways to derive a Postman-compatible collection from an OpenAPI spec. Here is one that works with the Redocly CLI:
# Install Redocly CLI
npm install -g @redocly/cli
# Validate the spec first
redocly lint openapi/petstore.yaml
# Bundle the spec (resolve $ref chains)
redocly bundle openapi/petstore.yaml -o dist/petstore-bundled.yaml
# Convert to Postman collection v2.1 using the openapi-to-postmanv2 library
npm install -g openapi-to-postmanv2
openapi2postmanv2 \
--spec dist/petstore-bundled.yaml \
--output dist/petstore-collection.json \
--prettyPrint
The output is a standard Postman collection JSON. You import it into Postman or use it as the base collection in Newman or the Postman CLI. Your pre-request scripts and environment variables remain separate files that you maintain independently; they are not overwritten when you regenerate the collection from an updated spec.
You can wire this into CI so the collection is always regenerated from the spec before tests run:
# .github/workflows/api-tests.yml
name: API contract tests
on:
push:
paths:
- "openapi/**"
- "src/**"
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
npm install -g @redocly/cli openapi-to-postmanv2 newman
- name: Validate OpenAPI spec
run: redocly lint openapi/petstore.yaml
- name: Generate collection from spec
run: |
redocly bundle openapi/petstore.yaml -o dist/petstore-bundled.yaml
openapi2postmanv2 \
--spec dist/petstore-bundled.yaml \
--output dist/petstore-collection.json
- name: Run tests against generated collection
run: |
newman run dist/petstore-collection.json \
--environment config/env-staging.json \
--reporters cli,junit \
--reporter-junit-export results/test-results.xml
- name: Upload test results
uses: actions/upload-artifact@v4
with:
name: test-results
path: results/
With this pattern, the spec is the input to every test run. A spec change that breaks a test is caught in the same PR that changed the spec.
Where Apidog fits in this workflow
Apidog’s value is not that it replaces Postman as a request runner. It is that it connects the OpenAPI spec to every other artifact your team works with, without the manual conversion step. The spec in Git stays the source of truth; Apidog is the collaboration and execution layer on top of it.
Apidog’s Spec-First Mode (currently in beta) lets you sync an OpenAPI spec from a Git repository directly into an Apidog workspace. From that synced spec, you get auto-generated mocks, interactive documentation, and test scenarios, all updated automatically when the spec changes in Git. You do not maintain a separate collection alongside the spec; the spec drives what Apidog shows and executes.
This matters for teams that experience what STC Group and the World Economic Forum described: maintaining Postman for testing, a separate documentation tool for spec rendering, and a mock server for frontend development, three systems that all need to reflect the same API contract. When the spec changes, you update it in one place and all three surfaces update. Worth verifying in a trial whether Apidog’s workspace permissions and SSO granularity meet your specific access-control requirements, particularly for large teams like the DHL deployment described (100+ users). Those are meaningful evaluation questions for a proof of concept.
For the migration path, you can convert your existing Postman collections to Apidog as a starting point, then make the spec the canonical document going forward. The mechanical import step is covered in detail in that linked guide.
Treating the spec as code in your Git workflow
The api-spec-as-code approach means the OpenAPI document gets the same treatment as application code: pull requests, code review, linting in CI, and version tags at release boundaries. Most teams find they already have the infrastructure for this; the missing step is applying it to the spec file.
A few practices that help:
- Store the spec in the same repository as the service it describes, not in a separate “docs” repo. This ensures spec changes happen in the same PR as code changes.
- Add a Spectral lint step to your CI pipeline. Spectral validates the spec against the OpenAPI specification and any custom rules your team defines. Broken schema references, missing descriptions, and inconsistent naming become CI failures, not review comments.
- Use branch-based spec development for breaking changes, the same way you would branch application code. Apidog workspaces support branching on the spec, so different teams can work against a stable branch while a breaking change is in review.
- Pin spec versions in downstream consumer repositories. When service B depends on service A’s spec for contract tests, it should reference a specific version tag, not the HEAD of main.
This approach is covered in depth in the git-native API workflow guide if you want a step-by-step setup for a new project.
FAQ
Do I have to stop using Postman entirely?
No. The methodology change is about dependency direction, not tool replacement. You can continue using Postman for exploratory testing and scripting. The difference is that your collection is generated from the spec before each test run, rather than maintained as a separate artifact. If your team prefers Postman’s UI for exploratory work, that preference is compatible with a spec-first workflow.
What happens to our existing Postman scripts and environment variables?
Your pre-request scripts, test scripts, and environment variable definitions are not part of the generated collection. They are separate files you maintain independently. When you regenerate the collection from an updated spec, the scripts are not overwritten. You keep the behavioral layer (scripts) while the structural layer (request definitions) is always derived from the spec.
How do I handle endpoints that are not yet in the spec?
In a spec-first workflow, an endpoint that is not in the spec is not ready for testing. That sounds strict, but it is the point: the spec gate ensures that new endpoints are formally described before tests are written for them. For exploratory development, you can work against a local stub and add the spec entry as part of the PR that introduces the endpoint. See the best OpenAPI validator tools guide for tools that make the spec-first editing step faster.
Is Apidog Spec-First Mode available now?
Apidog Spec-First Mode is currently in beta. You can access it through Apidog and evaluate whether the Git-sync workflow, branch support, and auto-generated mocks meet your team’s requirements. As with any beta feature, worth testing against your specific spec structure before committing to it as a production workflow.
What is the difference between this and importing my spec into Postman?
Postman can import an OpenAPI spec and generate a collection from it. That is a one-time conversion. The collection is then maintained independently of the spec, so drift resumes immediately. A spec-first workflow regenerates the collection from the spec on every CI run (or sync), so the collection is never more than one build out of date with the spec.
Conclusion
The drift problem your team is hitting is not a bug in Postman. It is the predictable result of maintaining two partially overlapping API descriptions without a clear dependency between them. The fix is to establish the OpenAPI spec in Git as the authoritative source, and treat the Postman collection as a generated artifact downstream of that spec.
That inversion changes what breaks and when. Spec changes that break tests are caught in the PR that made them. Documentation, mocks, and test scenarios stay aligned because they all read from the same source. The maintenance burden of keeping two systems in sync disappears because there is only one system.
Download Apidog and open a Spec-First Mode workspace with your existing OpenAPI spec. If you are starting from a collection rather than a spec, you can import the collection as an OpenAPI starting point and then work spec-forward from there. The Git-sync workflow becomes concrete once you see it running against your own API, rather than a contrived example.



