All sections

Migration

Migrate from Postman: import guide and limits

On this page

Still deciding? See Tetiva as a Postman alternative first, or download Tetiva and try the import on a real collection.

Moving over takes two actions: export your Postman collection as Collection v2.1, then import that file into Tetiva. Folder structure, requests, headers, bodies, auth, descriptions and saved responses come across, and environments come across as separate files. Scripts come across when you tick Import scripts during the import. Collection variables become an environment named after the collection. Anything tied to the Postman cloud does not come across, and the checklist below says exactly what to look at.

Step 1. Export from Postman#

  1. In the collection menu choose Export and the Collection v2.1 format. Save the .json.
  2. Export environments separately — one file per environment.

Format v2.0 is rejected: the import stops with unsupported schema, only Postman Collection v2.1 is supported. If someone handed you a file and you are not sure, open it and check info.schema — it must contain v2.1.

Step 2. Import into Tetiva#

  • Into the sidebar root — the Import button above the collection tree → Import File….
  • Inside an existing collection — right-click it and choose Import File…. The imported tree lands inside that collection.
  • Pick the .json. A confirmation dialog opens first: how many folders, requests and examples the file holds, where the collection goes, the hosts its requests call, what changed on import, and the scripts in the file. Scripts come in only when you tick Import scripts. Click Import, and a toast such as Imported “Payments API”: 4 folders · 27 requests · 3 examples confirms it while the new collection opens in a tab.
  • Environments — the environment selector in the request bar → Manage Environments… → the import button (tooltip Import a Postman or Hoppscotch environment). Import File… in the sidebar takes an environment file too.

The Postman collection itself becomes a normal Tetiva collection and its folders become nested collections. Nesting depth is not capped.

Tetiva
v1.3.1
A collection context menu in Tetiva with the Import File… entryA collection context menu in Tetiva with the Import File… entry
Import File… in this menu imports a file into the collection you right-clicked

Concept mapping#

PostmanTetiva
CollectionTop-level collection: name, description, auth
FolderNested collection: name, description, auth
RequestRequest: name, method, URL, headers, body, auth
Disabled headerHeader with its checkbox off — the value is kept
Auth: Bearer, Basic, API KeySame types; API Key keeps its name, its value and its location — header or query
Auth: OAuth 2.0, JWT, Digest, AWS SignatureThe same schemes; OAuth 2.0 grants and the JWT algorithm come across, and authorization_code_with_pkce arrives as Authorization Code
Auth: NTLM, Hawk, othersNo Auth; a list of what did not come across is shown after the import
A request with no auth blockInherit: auth comes from the folder or collection; an explicit noauth becomes No Auth
Per-request descriptionThe description on the Docs tab
Body: raw + JSONJSON body
Body: raw + XML or HTMLXML body
Body: raw with no languageRaw body
Body: form-dataForm body; file fields must be re-picked
Body: GraphQLA GraphQL request — POST, with query and variables in place
Body: x-www-form-urlencodedForm body with the original keys, values and enabled flags
Body: binaryBinary body without its file — choose the file again
Pre-request and Tests scriptsPre-request and post-response scripts, when you tick Import scripts
Saved responses (Examples)Response examples; an example with a body over 256 KB is skipped
Collection variablesAn environment named after the collection; pick it in the environment list
Environment (separate file)Environment; secret-typed variables stay secret and disabled ones stay disabled
A method outside GET…HEADGET

What does not carry over#

ItemWhat to do
GlobalsA globals file becomes an environment named "Globals" or after the file: Tetiva has no global level
Path variable values (:id)The placeholder stays in the URL — substitute an environment variable
Mock servers, monitors, Runner, FlowsNo equivalent

Check these after the import#

Inherited auth. A request with no auth block of its own is imported with Inherit and, as in Postman, uses the auth of the folder or collection above it. An explicit noauth becomes No Auth. How the lookup walks up the tree is covered in Authentication.

Scripts. They come across only when Import scripts is ticked in the confirmation dialog. Tetiva implements part of the pm object, so unsupported pm.* calls need fixing by hand — see the table below.

Schemes with no equivalent. NTLM, Hawk and the rest arrive as No Auth, but not silently: a toast stays up after the import with a line per auth block, naming the collection, folder or request it came from and the reason. Walk that list and configure those requests again — see Authentication.

Files. A binary body and form-data file fields arrive without their files: pick the file again in the Body tab.

Environment variables. Variables disabled in Postman stay disabled. Collection variables go into an environment of their own, and their {{variables}} won't resolve until you pick it.

Secrets. Secret-typed variables stay secret in Tetiva, but the Postman export file holds their values in plain text — do not leave it in a shared folder.

Scripting: pm.* coverage#

Tetiva scripts run on the goja engine — JavaScript, but neither Node nor a browser. The pm object is implemented partially: tests built on pm.test and pm.expect usually run as is, while pm.sendRequest, pm.globals and require need replacing. The full reference lives in Scripting.

CallStatus
pm.environment.get(key), set(key, value), unset(key)Supported
pm.variables.get, set, unset, has, replaceIn, toObjectSupported: a value set in a pre-request script fills that request's {{variables}} and reaches its post-response script, but is not saved to the environment; get falls back to the environment
pm.request.method, pm.request.url, pm.request.protocolSupported; url is a string, not an object, and protocol is http, grpc, graphql or websocket
pm.request.headers.add({ key, value }), upsert({ key, value }), remove(key)Supported; names match in any case, as in Postman, and headers has no other methods
pm.response.code, pm.response.statusText, pm.response.text(), pm.response.json()Supported in post-response scripts; statusText is gRPC only — undefined for HTTP and GraphQL. headers.get(name), headers.has(name) and responseTime are there too
pm.response.statusSupported: the reason phrase, "OK", as in Postman; the status name for gRPC
pm.test(name, fn)Supported; results show up in the Tests tab
console.log, info, warn, errorSupported; output is collected per run, and objects and arrays print as JSON
btoa(), atob()Supported, so a pre-request script that builds a Basic header runs as is; atob also reads base64url, such as a JWT payload
pm.expect(...), pm.response.to.have.status(...)Supported: chai 4.5, as in Postman; pm.response.to covers status, header, body, jsonBody, json and the status classes
pm.collectionVariables.get/set/unsetSupported; works on the active environment's variables
pm.globalsNot available: the call fails with pm.globals is not supported in Tetiva; use pm.environment
pm.sendRequest(), pm.setNextRequest()Not available; pm.sendRequest fails with a message that scripts cannot make network calls
require(), file or network access from a scriptNot available — the sandbox is closed and a run is cut off after 5 seconds

A typical Postman test runs unchanged:

pm.test("status is 200", function () {
    pm.response.to.have.status(200);
});
pm.environment.set("token", pm.response.json().access_token);

A test fails when an assertion fails or the function throws. A failed assertion shows just its message next to the test name in the Tests tab, as in Postman; any other error also names the line it broke on. A pre-request script that throws outside pm.test stops the send, as in Postman: the response pane says Request not sent with the error and its line. A failing post-response script keeps the tests that passed before it broke.

Exporting back to Postman#

The door swings both ways: right-click a collection and choose Export as Postman to write a v2.1 file named <collection>.postman_collection.json. Environments export from Manage Environments… with Export as Postman.

Scripts and response examples are exported. gRPC requests have no place in the Postman format, so they are skipped with a warning. A WebSocket request keeps its address and headers, but not its messages. More detail in Import and export.

updated