Streaming read mode (MPT-Streaming: true) reads the whole filtered, sorted result set as a stream. Two obligations are mandatory for a correct read:
Verify completeness — compare the objects received with MPT-Item-Count. A mid-stream failure aborts the connection without completing the message, so a truncated body is the only failure signal.
Check $meta.deleted before ingesting — a record deleted, or moved out of scope, after the stream started arrives as an ID-only stub. Ingesting one as data overwrites a stored record. Soft-deleted records are ordinary records.
Stream the full result set instead of a page. Membership fixes at stream start, each record is emitted once, and MPT-Item-Count gives the exact count. Accept: application/jsonl for line-delimited output. A positive limit caps the stream, -1 or absent reads all; offset skips that many records of the requested order, so limit and offset together read one window. Each window is its own snapshot — consecutive windows are not a resumable export.
OK
Streamed and paged responses both answer 200. Only a streamed one carries the MPT-Streaming and MPT-Item-Count headers listed below.
application/jsonl: one object per line, no envelope, so the schema describes one line. A line is a record or an ID-only deleted stub (StreamedDeletedRecord) — check $meta.deleted before ingesting. Blank lines are keep-alives.
Streamed responses only, where it is true. Absent on a paged response.
Streamed responses only. Absent on a paged response. The exact object count — compare it with the number received.
Invalid RQL, or invalid paging. limit must be positive (caps the stream) or -1 / absent (reads all); offset must be a non-negative integer.
No content
No acceptable media type. application/jsonl without the MPT-Streaming header lands here.
No content
The result set exceeds the configured stream key cap. Nothing is written to the body.
No content
This resource's query service provides no streaming capability.
No content
GET /public/v1/public-catalog/segments HTTP/1.1
Host: api.platform.softwareone.com
Accept: */*
{
"$meta": {
"pagination": {
"offset": 1,
"limit": 1,
"total": 1
},
"omitted": [
"text"
]
},
"data": [
{
"id": "text",
"audit": {
"created": {
"at": "2026-01-01T00:00:00.000Z",
"by": {
"id": "text",
"name": "text",
"icon": "text",
"revision": 1
}
},
"updated": {
"at": "2026-01-01T00:00:00.000Z",
"by": {
"id": "text",
"name": "text",
"icon": "text",
"revision": 1
}
},
"published": {
"at": "2026-01-01T00:00:00.000Z",
"by": {
"id": "text",
"name": "text",
"icon": "text",
"revision": 1
}
},
"unpublished": {
"at": "2026-01-01T00:00:00.000Z",
"by": {
"id": "text",
"name": "text",
"icon": "text",
"revision": 1
}
}
},
"$meta": {
"omitted": [
"text"
]
},
"name": "text",
"revision": 1,
"description": "text",
"status": "Draft"
}
]
}Client timeouts. Set no total-request deadline — a stream lasts as long as its result set takes. Size the two limits that remain: allow at least 60s to the first byte, since nothing is on the wire while the key snapshot runs, and more than 30s between bytes, since idle gaps carry only keep-alive whitespace. One scalar timeout applied to connect and read alike trips on both.