We have just released version 5.61.0. Here is a list of the changes that came with the release:
Features
- Added the ability to import an AsyncAPI specification to create messaging mappings automatically — the messaging counterpart of importing an OpenAPI specification for HTTP. Go to JMS or IBM® MQ in the top navigation bar and click Import AsyncAPI, then upload a JSON or YAML AsyncAPI 2.x or 3.0 document. Traffic Parrot parses the document's channels and operations and shows a preview of one mapping per importable operation (destination, queue/topic type, operation id, the example payload generated from the message schema, and a duplicate-status badge); you select exactly which operations to import with per-row checkboxes and an Import Selected count. A malformed, unsupported, or empty document reports a clear error and creates nothing. Each selected operation becomes a mapping — a JMS mapping from the JMS page or a native IBM® MQ mapping from the IBM® MQ page — that serves the generated example payload, ready to refine in the editor. Both AsyncAPI 2.x and AsyncAPI 3.0 documents are supported with the JMS and IBM® MQ channel bindings; for a 3.0 document the destination is taken from the channel's address (falling back to the channel name). Both one-way send/receive operations and request-reply operations (those carrying an AsyncAPI 3.0 reply object) are imported: a request-reply operation receives the request on the operation's own channel and publishes the reply message's example on the reply channel's destination, shown in a Reply destination column in the preview. Other bindings (AMQP, Kafka, MQTT) and AsyncAPI 4.x are not yet supported, and advanced JSON Schema draft 2020-12 constructs that cannot yet be turned into an example render a placeholder payload.
- The headless trafficparrot validate command now also checks your messaging mappings against your imported AsyncAPI specifications, so a partially-mocked messaging API cannot silently drift from its contract — the messaging counterpart of the OpenAPI (HTTP) and proto (gRPC) coverage checks. It enumerates the operations declared in the AsyncAPI specifications under <files-root>/asyncapi/ and reports any declared operation that has no backing JMS, native IBM® MQ or file-message mapping, for example No mapping covers AsyncAPI operation: QUEUE:orders. Operations are matched to mappings by destination identity (TYPE:name, where TYPE is QUEUE or TOPIC); for a request-reply operation coverage is measured on the inbound (request) destination only. Messaging drift participates in the same report and the same exit codes as the HTTP and gRPC checks (drift fails the build with exit code 1). Destinations you deliberately leave unmocked can be excluded with a messaging-coverage.properties file (key exclude.destinations) in the files-root, and a stale allowlist entry for a destination not present in any AsyncAPI specification is itself reported as drift. See Messaging coverage check on the JMS page.
- The add/edit messaging-mapping editor now has a skeletons dropdown that pre-fills a messaging mapping form from an operation in an imported AsyncAPI specification — the messaging counterpart of the HTTP and gRPC skeletons dropdowns. Place AsyncAPI specifications (JSON or YAML, 2.x or 3.0) into the install's asyncapi/ directory (or use the import button beside the dropdown to upload one), then pick an operation: the form's destination name, destination type (Queue/Topic radio) and request body/payload pre-fill. For a request-reply operation the option is labelled <operationId> (request-reply) and pre-fills both the request side and the reply side (a cloned response row); a one-way operation pre-fills the request side only. The dropdown appears in both the JMS and native IBM® MQ messaging editors. See Messaging skeletons on the JMS page and on the IBM® MQ page.
- Added the ability to import an async-message Pact contract as JMS or native IBM® MQ messaging stubs — the messaging counterpart of importing a Pact contract's HTTP interactions. Go to JMS or IBM® MQ in the top navigation bar and click Import message Pact, then upload a Pact .json file. Both contract shapes are detected automatically: a specification v3 contract's top-level messages[] array and a v4 contract's Asynchronous/Messages interactions[] (whose example body is read from the contents.content envelope). An HTTP-only contract is rejected with a message pointing you to the HTTP Pact import. Traffic Parrot shows a preview of one mapping per message interaction (destination, queue/topic type, the message description as the operation id, the example contents payload, and a duplicate-status badge); you select exactly which messages to import with per-row checkboxes and an Import Selected count. A file that is not valid JSON or has no message interactions reports a clear error and creates nothing. Each selected message becomes a one-way publish mapping — a JMS mapping or a native IBM® MQ mapping — that publishes the example payload on receipt of any message on its destination; Pact message interactions are fire-and-forget, so these are not request-reply stubs. Because a Pact message carries no destination, it is derived from the message's metadata (a destination, queue or topic key, where a topic key makes it a TOPIC) or, failing that, from the message's description; a description-derived destination raises a warning in the preview so you review it before importing. Import message Pact is licence-gated, available on a JMS or IBM® MQ licence respectively (the menu link does not appear without it). See Import a message Pact contract on the JMS page and on the IBM® MQ page.
- You can now import a Pact contract (consumer-driven contract, specification v2, v3 and v4) as HTTP stubs. Upload the Pact .json file on the HTTP Import page exactly as you would any other format — Traffic Parrot detects it automatically (no format to choose) and turns each HTTP interaction into a stub mapping through the same preview, filter and select flow used for HAR and OpenAPI/Swagger. The request (method, path, query, headers, body) becomes the request matchers and the response (status, headers, body) becomes the stubbed response; JSON request bodies are matched tolerantly. For v4 contracts the Synchronous/HTTP interactions are imported (their bodies are read from the v4
body.content/body.contentTypeenvelope); everything else is imported the same way as for v2 and v3. PactmatchingRulesare honoured where they map onto Traffic Parrot's request matchers (request header and pathregex, default JSON-body type matching); other rules fall back to an exact match and the import reports a warning listing them. This HTTP import handles HTTP interactions only — Pact message (asynchronous) interactions, including the Asynchronous/Messages interactions of a v4 contract, are imported separately as JMS or IBM® MQ messaging stubs (when a v4 contract mixes the two, the HTTP import brings in the HTTP interactions and skips the message ones with a warning). Response templating and provider verification / Pact Broker pull are not yet supported. See Importing Pact contracts. - Added the ability to export HTTP mappings as an OpenAPI 3.0 specification — the inverse of importing an OpenAPI specification. The active scenario's mappings are translated into OpenAPI paths and operations (grouping by path and method, normalising exact, templated and regular-expression URL matchers into OpenAPI paths, lifting query and header matchers into
parameters, and emitting each response body as a literalexampletogether with an inferred JSONschemafor JSON bodies) and served off the existing export endpoint via a new?format=openapiquery parameter (GET /http/management/exportMappings?format=openapi), returning a YAML document (Content-Type: application/yaml) as openapi-<timestamp>.yaml; without the parameter the endpoint still returns the native WireMock ZIP unchanged. The same document can also be exported as JSON with?format=openapi-json(Content-Type: application/json, downloaded as openapi-<timestamp>.json) — only the serialisation differs. The OpenAPI export can be triggered from the GUI with the Export as OpenAPI (YAML) button on the HTTP Export page (alongside the existing Download Mappings button) as well as programmatically through the endpoint. Matchers with no clean OpenAPI representation (regex/JSONPath/XPath body matchers, proxy responses) are never silently dropped — every mapping's disposition (REPRESENTED,APPROXIMATEDorOMITTED) is recorded in a coverage report surfaced both as a root-levelx-trafficparrot-export-coverageextension and as a one-line summary in info.description. For each JSON response body Traffic Parrot also infers a JSONschemaand emits it alongside the example, so generated clients, SDK codegen and documentation portals get real models rather than just a sample value; inference is conservative and based on the single example body (structure followed recursively, integral numbers becomeintegerand non-integralnumber, JSON null becomes nullable, observed keys becomepropertiesbut none is marked required, and no enum is inferred). A non-JSON response body (XML, plain text, empty) gets no schema — the example is still emitted and the mapping is recorded in the coverage report with reason no-schema-inferred. This release is single-scenario and OpenAPI 3.0 (not 3.1), with no multi-example merge or security schemes yet. - Added the ability to export recorded HTTP traffic as a HAR 1.2 file, ready to drive a load or resilience test through your own engine. Unlike the native ZIP and OpenAPI exports, which export the deduplicated mappings, the HAR export is taken from the live request journal — the ordered, timed stream of inbound requests served during the current session — so the request order and per-request timing a load profile needs are preserved. Each request becomes one HAR
log.entriesentry carrying the method, URL, headers, query string and request body, the response status, headers and body, andstartedDateTime/time. Click the new Download recorded traffic (HAR) button on the HTTP Export page (alongside Download Mappings and Export as OpenAPI (YAML)), or trigger it programmatically off the existing export endpoint with the?format=harquery parameter (GET /http/management/exportMappings?format=har), which returns a HAR 1.2 document (Content-Type: application/json) downloaded as recorded-traffic-<timestamp>.har; without the parameter the endpoint still returns the native WireMock ZIP unchanged. The exported HAR can be fed into the common HAR-to-load-test converters such as the Gatling HAR Converter or Grafana har-to-k6 (Traffic Parrot does not run the load itself — you supply the engine). The export reads the in-memory request journal, so only the most recent requests retained by trafficparrot.virtualservice.maxRequestJournalEntries (default 1000) are exported; if the journal is disabled (=0) the export is a valid but empty HAR. This first release exports text bodies for HTTP traffic only. - HAR import now offers explicit conflict resolution for duplicate entries. When a preview entry matches an existing stub with the same HTTP method and exact URL, an On duplicate dropdown on that row — and a single For duplicates: control that applies to every duplicate at once — lets you Skip it (the default, so imports you do not touch are unchanged), Overwrite the existing stub (all stubs matching that method and URL are removed before the imported one is added, so no duplicate is left behind), or Import as new (the existing stub is kept and the imported one is added under a disambiguated name such as <name> (copy)). A per-row choice overrides the bulk default. Re-importing the same file still replaces the mappings it created last time, so those entries show as New; the actions apply to a clash against a stub from a different import or one created by hand. The same choice is available on the REST import endpoint (POST /http/management/importSelectedEntries) through an optional
conflict-strategyparameter (skip|overwrite|importAsNew, defaultskip) with per-entryconflictStrategiesoverrides; omitting the parameter keeps the previous behaviour. Duplicate detection is an exact method-and-URL match, so an existing stub that matches its URL by pattern or regular expression is not detected as a duplicate. See Preview and filter before importing. - The HTTP and gRPC mappings list now shows the
bodyFileNamepath for a mapping whose response body is served from a binary file (an image, PDF or other non-text file), truncated to fit the column with the full path on hover, instead of an unreadable placeholder — so you can tell at a glance which mapping serves which file. Inline, recorded, and text file-backed responses show their body content in the Response body / Response message column as before. See File-backed responses in the mappings list. - In the HTTP and gRPC mappings list, hovering a row whose response body is an image file (PNG, JPEG, GIF, WebP, BMP, ICO, APNG or AVIF) now pops a small rendered preview of the image instead of the file-path tooltip, so you can recognise the picture a mapping serves without opening the editor. The cell still shows the truncated
bodyFileNamepath; the preview only changes what the hover shows, is loaded on first hover and capped to a thumbnail, and falls back to the plain path tooltip if the image cannot be read. Non-image binary rows keep the full-path tooltip. See File-backed responses in the mappings list. - The HTTP mappings list now shows a composite request body matcher — one built from the logical
and,orornotoperators — as a readable one-line summary in the Request body column, for example and (contains 'A', contains 'B') or not (equalTo 'X'), instead of the raw matcher JSON. The row's request-match hover tooltip (which already summarised the method, URL matcher, URL and query parameters) now also lists each request body matcher on its own Body: line. Simple (leaf) matchers such as equalTo and contains are shown exactly as before; this changes only how existing matchers are displayed — nothing about how requests are matched or how mappings are saved changes. - The HTTP Add/Edit mapping panel now shows a live, non-blocking warning beneath the URL match mode when you combine a full-URL match mode (equal to or matches regex) with one or more query parameter matchers — a combination that is almost always wrong, because those modes match the whole URL (including the query string) and conflict with the separate query parameter matchers. The warning explains the problem and recommends switching to a path-only mode (path equal to or path matches regex), and it appears and disappears as you change the URL mode or add and remove query parameter rows. Saving is not blocked.
- The HTTP and gRPC Add/Edit mapping forms now show a Manage files link in the response body area that opens the Static Files browser in a new browser tab, so you can manage the files a response is served from without leaving — or losing — the mapping you are editing. The link is always shown, whether the response is inline or already file-backed. Previously the Static Files browser was reachable only from the HTTP menu.
- The HTTP and gRPC Add/Edit mapping forms now show an inline preview of an image response body file (PNG, JPEG, GIF, SVG, WebP, BMP, ICO, APNG or AVIF) above the Response from file note, so you can see at a glance which image a mapping serves without opening the file. The body field stays read-only for binary files as before, and non-image binary files keep the read-only field with no preview. This mirrors the inline image rendering already used in the Static Files browser preview pane. See Editing a file-backed response in the UI.
- On the HTTP and gRPC Add/Edit mapping forms, clicking Switch to file now shows a Choose an existing file… dropdown beside the response body file name field, listing the files already in the scenario's __files directory (including nested responses/ files). Selecting one fills the file name so you can point a response at an existing body file without typing the path; typing the name by hand still works as before. See Editing a file-backed response in the UI.
- The HTTP Mapping cleanup results now include a collapsible Per-endpoint detail view showing, per recorded endpoint, exactly what cleanup did to it (kept, consolidated, headers stripped, body match removed, URL pattern applied, response template added, or removed), plus a consolidation-groups breakdown of which recorded URLs collapsed into each surviving pattern. The /api/http/cleanup/execute response gains matching
endpointDispositionsandconsolidationGroupsfields. - The HTTP Add/Edit mapping editor's request body matcher dropdown now offers matches JSON schema, which was previously only usable by editing the mapping JSON directly — it matches when the request body is JSON that validates against the given JSON Schema. Enter the schema as the matcher value; it round-trips on save. The advanced JSON-only option (the JSON Schema
schemaVersiondialect selector) remains available by editing the mapping JSON — see the JSON-only matchers reference. - The HTTP Add/Edit mapping editor's Request URL matcher dropdown now offers path template as a fifth URL match type, alongside equal to, matches regex, path equal to and path matches regex. Enter a URL path template with named variables such as /orders/{orderId}; a request path matches when it fits the template's shape regardless of the concrete variable values (so /orders/{orderId} matches /orders/123). It persists as the
urlPathTemplaterequest field and round-trips on save. The matcher also appears in the editor's Available helpers panel under URL match types. - The HTTP Add/Edit mapping editor now also matches request headers with per-header rows — each with a header name, a matcher dropdown (equal to, contains, matches regex, does not match regex, equal to date/time, before date/time and after date/time) and a value — using the same click-to-add-rows editing already offered for query parameters. The free-text request-headers field is kept for bulk, copy-paste-friendly editing, and the rows and text area stay in two-way sync (most recent edit wins). Click Add request header to add a row and the trash button to remove one. The saved mapping JSON is unchanged (standard WireMock request
headers), so existing mappings load back into both views and round-trip on save, and no header-matching expressiveness is lost. - The HTTP Add/Edit mapping editor now also lets you set the stub's response headers with per-header rows — each with a header Name and a Value — using the same click-to-add-rows editing already offered for request headers and query parameters. Response headers are static Name: value pairs the mock returns rather than request matchers, so a row has just a name and a value (no matcher dropdown). The free-text response-headers field is kept for bulk, copy-paste-friendly editing, and the rows and text area stay in two-way sync (most recent edit wins). Click Add response header to add a row and the trash button to remove one. The saved mapping JSON is unchanged (standard WireMock response
headers), so existing mappings load back into both views and round-trip on save. The gRPC and messaging editors are unchanged. - A file-backed request body matcher (one whose value is read from a bodyFileName file in __files) is now editable in the HTTP Add/Edit mapping editor, like a file-backed response: a Content from file note names the file, the request body field is pre-filled with its contents, and saving writes your edit back to the file (the matcher keeps its bodyFileName reference). A single file-backed text matcher also offers a Switch to inline button (mirroring the file-backed response control) that detaches the bodyFileName reference and keeps the loaded contents as an inline matcher value; on save the matcher is stored inline, with no __files reference and the file on disk left untouched. A binaryEqualTo matcher, or a mapping with more than one request body matcher, stays read-only, offers no Switch to inline, and is edited on disk. See Request body file: In the GUI.
- The Available helpers panel is now also available on the gRPC mapping editor (gRPC » Add/Edit), as it already is on the HTTP and messaging editors. Expand the collapsible Available helpers card to browse, filter and copy the response-templating helpers and the request-body matchers that apply to a gRPC mapping, without leaving the editor.
- HAR import now offers an opt-in Preserve full fidelity (all headers) mode. By default an imported stub stays flexible — it matches on method, URL and the request Content-Type, and its response carries only the status, body and Content-Type, with all other request and response headers dropped so the stub is not tied to the exact browser, session or environment that produced the recording. Tick the new Preserve full fidelity (all headers) checkbox next to Import Selected on the HAR import preview (off by default; a whole-import setting, not per-entry) to instead turn every recorded request header — including Content-Type — into an exact request matcher and emit every recorded response header (with the exact response Content-Type and charset) on the stub response. This produces a faithful reproduction of the recorded exchange but makes stubs strict and often single-use: headers such as Host, Cookie, Authorization and Content-Length tie the stub to a specific host, session, token or body, so leave it off for reusable stubs. HTTP/2 pseudo-headers (:method, :authority, :scheme, :path, :status) are automatically excluded. The same behaviour is available programmatically through an optional
preserveAllHeadersparameter on the /http/management/importMappings and /http/management/importSelectedEntries REST endpoints. Request and response bodies import unchanged (base64-encoded bodies are decoded automatically), and the option affects HAR import only — OpenAPI, Swagger, RAML, Pact and WireMock ZIP imports are unaffected. See Preserve full fidelity (all headers). - Added a Keep valid-JSON response body inline option to HTTP recording. Tick it under Advanced parameters on the HTTP Record page to keep a recorded response body inline in the mapping (as a structured
jsonBody) when it is valid JSON served with a text content type, instead of writing it to a separate __files/ body file — so a recorded JSON API produces self-contained mappings with no companion body files. Non-JSON text bodies and binary bodies (including a binary content type whose bytes happen to parse as JSON) are still externalised to __files/ as before, and there is no size limit on inlining, so a very large JSON response is embedded directly in the mapping file. The option is off by default, so existing recording workflows are unchanged; set trafficparrot.http.recording.response.inlineJson in trafficparrot.properties to change the checkbox's default state. See Keeping JSON response bodies inline. - Added an Externalise request body to file option to HTTP recording — the request-side counterpart of the response-side inline option, and the write-time counterpart of a file-backed request body matcher. Tick it under Advanced parameters on the HTTP Record page to have a recorded request body written to a separate __files/ file, with the recorded mapping's request matcher carrying a
bodyFileNamereference (equalToJson,equalToXml,binaryEqualToorequalToaccording to the request's content type, a binary body written byte-for-byte) instead of an inlinebodyPatternsvalue. Empty and multipart request bodies are always kept inline. An externalised request body loads, matches on replay, and is editable in the Add/Edit mapping editor exactly like a manually file-backed one. The option is off by default, so existing recording workflows produce byte-identical mappings; set trafficparrot.http.recording.request.externaliseToFile in trafficparrot.properties to change the checkbox's default state. See Externalising request bodies to files. - The URL contains filter on the HTTP import preview now supports glob wildcards —
*for any sequence of characters and?for any single character — in addition to plain substring matching. Plain text still matches any path that contains it; a pattern with a wildcard switches to an anchored, case-insensitive match against the request path (for example/api/*,*.jsonor/users/?). This filters which entries are shown for selection only and does not change how the imported stubs match at runtime (GitHub issue #68). - The admin request-journal endpoint (GET /api/http/requests) now accepts two optional query parameters for paging and filtering a large journal:
limitbounds the response to the first N entries in journal order, andsincereturns only the requests recorded strictly after a given ISO-8601 timestamp (for example 2026-07-16T10:00:00Z); a negativelimitor a malformedsinceis rejected withHTTP 400. Both are off by default, so a request with neither parameter still returns the whole journal unchanged, and themeta.totalfield continues to report the full count of everything recorded, independent of either parameter. See Page or filter the journal.
Documentation
- Added a Recording HTTPS via the browser proxy section to the User Guide. It explains that Traffic Parrot records HTTPS by acting as a browser (forward) proxy: point your browser or application's proxy setting at Traffic Parrot, import the Traffic Parrot CA certificate (certificates/virtualservice-CA-keystore.p12, password trafficparrot, PKCS12) into the client's trust store, and Traffic Parrot mints a per-host certificate on the fly from the TLS SNI so it can decrypt and record traffic to any host. The Recording HTTP section links across to it.
Changes
- The default in-memory request-journal retention has been lowered from 10000 to 1000 entries. The trafficparrot.virtualservice.maxRequestJournalEntries property bounds all request journals — HTTP, gRPC and JMS/IBM® MQ — so by default each now keeps the last 1000 requests (older entries age out as new requests arrive) instead of 10000. This keeps the default -Xmx128m install memory-safe under a sustained first-run/evaluation workload, where the oversized journal could otherwise exhaust the heap. If you need a longer request-log history, raise maxRequestJournalEntries in your trafficparrot.properties; the JVM heap setting (-Xmx128m) is unchanged.
