Skip to content

File Format (.pro)

A .pro file is a JSON-encoded snapshot of captured traffic. Probe writes it when you save a session (Cmd+S on a recording tab) or export entries via the right-click menu. The same file shape was previously called .gmp (“Guide MITM Proxy”); both extensions are still accepted on import.

Probe also writes two related shapes — collection exports for a multi-entry export and request exports for a single entry. The importer routes by the JSON format field, not the file extension.

The first key tells the importer what’s inside:

{
"format": "guide-session" | "guide-collection" | "guide-request",
"version": 1,
...
}

Probe trusts the format value over the extension — you can rename a file from .json to .pro (or vice-versa) and import will still work.

The full snapshot a saved tab produces. Lives in ~/.probe/sessions/<id>.json for the in-app sessions list; written to a user-chosen path on Save Session….

{
"format": "guide-session",
"version": 1,
"id": "01HXY7M0QZJ8R5ZF6Q4Y8MR8GA",
"name": "Auth flow — staging",
"createdAt": 1731081900123,
"entries": [
{ /* LogEntry */ },
{ /* LogEntry */ }
]
}
FieldTypeDescription
formatstringMust be "guide-session".
versioninteger1 today. Bumped on a breaking format change.
idstringSession id (ULID-style).
namestringDisplay name. Editable via the Sessions manager.
createdAtintegerMilliseconds since epoch, UTC.
entriesarrayOne LogEntry per captured request.

The export format for a multi-entry export (right-click on selected rows → Export).

{
"format": "guide-collection",
"version": 1,
"exportedAt": 1731082000000,
"entries": [ /* LogEntry, ... */ ]
}

Same entries shape as a session, without the session-level id and name. On import, each entry is added to the active recording tab.

A single-entry export. Useful for sharing one request without surrounding noise.

{
"format": "guide-request",
"version": 1,
"entry": { /* LogEntry */ }
}

The same LogEntry JSON appears inside every Guide format above:

{
"id": 142,
"method": "POST",
"url": "https://api.example.com/v1/users",
"statusCode": 201,
"timestamp": 1731081900123,
"clientAddr": "Chrome",
"reqHeaders": {
"content-type": "application/json",
"authorization": "Bearer ..."
},
"reqBody": "{\"name\":\"Ada\"}",
"resHeaders": {
"content-type": "application/json",
"content-length": "21"
},
"resBody": "{\"id\":1,\"name\":\"Ada\"}",
"contentType": "application/json",
"durationMs": 184,
"reqSize": 124,
"resSize": 21
}
FieldTypeNotes
idintegerUnique per session.
methodstringHTTP method.
urlstringFull URL the client sent. MITM-intercepted entries carry the explicit :443/:80 port.
statusCodeinteger0 if no response was received (request errored mid-flight or was aborted).
timestampintegerMilliseconds since epoch, UTC.
clientAddrstringProcess name for loopback traffic, IP address for remote phones. May be empty.
reqHeadersobjectLower-cased keys, single value per key.
reqBodystring | nullRaw body as text. Bodies above the size cap or non-text content show as "[binary or oversized body]".
resHeadersobjectSame conventions as reqHeaders.
resBodystring | nullSame conventions as reqBody.
contentTypestring | nullSniffed from the response.
durationMsinteger | nullTotal request → response time.
reqSizeintegerBytes-on-the-wire estimate of the request.
resSizeintegerBytes-on-the-wire estimate of the response.

Fields not in the JSON are tolerated by LogEntry.fromJson — defaults are applied (statusCode = 0, empty headers, etc.). That makes forward-compatibility easy: a future version that adds new fields can be loaded by an older Probe.

  • .gmp files — same JSON shape, accepted by every importer. Probe writes .pro for new exports.
  • .json files — accepted; the importer sniffs format.
  • Renamed extensions — fine. Content-sniffing wins over the extension.
  • No request/response that was already discarded for size — bodies stripped at capture time stay stripped. Sessions are wire-level, not browser-level.
  • No HAR support today. Probe doesn’t read or write HAR.
  • No environment data, scripts, breakpoints, or rules. A .pro only carries traffic. Compose collections (with environments and scripts) live separately under ~/.probe/compose/<collection-id>.json.
  • Sessions — the user-facing feature this format underpins.
  • Internal REST API — fetch saved sessions via /api/v1/session-tabs/saved/{id}.