Get a record's full parsed content and metadata
Changed onRetrieve the full parsed content and metadata of a single record — the same content PipesHub's own RAG/chat pipeline uses to answer questions, returned directly instead of via chat.
When to use this vs. the other record endpoints:
- GET /knowledgeBase/record/{recordId} returns metadata only (name, type, indexing status, size) — no content.
- GET /knowledgeBase/stream/record/{recordId} returns the original, unparsed file bytes — use it to download/open the source file.
- This endpoint returns the record's full parsed content as a single plain-text content string (a metadata header, then the block/table text in reading order, then any foreign-key related tables) — use it when you need the record's actual textual/tabular content without downloading and re-parsing the original file yourself.
Typical flow: obtain a recordId from a pipeshub_search hit or a chat citation's recordId, then call this endpoint to read the full content when the search snippet or citation excerpt isn't enough to answer the question.
Reading part of a long record, or a whole Slack thread:
With no query parameters the record is returned up to 140,000 characters (a longer one is cut and marked truncated), which for a pull request with its diffs or a long document is a large response. Pass any of maxChars, startBlock, query or mode for a budgeted read instead: the response stays within maxChars and says how to continue (nextStartBlock, or nextStartRecord for a thread). query makes a record too large for the budget show its most relevant blocks first, with the skipped ranges marked. mode=thread returns every message of the Slack thread the record belongs to, oldest first, as far as the caller may see them. A Slack record in no single thread (several channel messages in one record, or a message without replies) returns itself, then the replies of each thread its messages started; the first page opens with a bracketed note saying which.
Permission scoping:
The requesting user/token must have access to the record; access is verified via the knowledge graph before content is returned — a caller with a valid scope but no access to this specific record gets a 403.
A connected app with a limit: the rendered text names nothing outside the limit beside the record. Its External Parent ID reads N/A for a parent the limit leaves out, and a code file's Path: line is left out unless the limit covers the whole app. Linked records, related tables, a deal's orgs and products, and live Jira parent, epic, sub-task and linked-issue lines appear only for records inside the limit. Web URL is kept, though it can contain folder names.
Request
- Base URLhttps://app.pipeshub.com/api/v1
- URLhttps://app.pipeshub.com/api/v1/connectors/record/{recordId}/content
- Auth
- HTTP bearer
- or OAuth 2Authorization code: /api/v1/oauth2/authorizeClient credentialsToken URL: /api/v1/oauth2/token scopes: connector:read
Path parameters
Record ID to fetch. Obtain it from a pipeshub_search result (hits[*].recordId) or a chat citation (citations[*].recordId).
Query parameters
Most characters of content to return. Asks for a budgeted read; 40000 when another budgeted-read parameter is given without it.
With query, in record mode and without startBlock: return only the passages that answer query, as the model assigned to the reader role (else the default model) copies them out, instead of the record's text. The model is told to copy word for word, and extract.unverifiedLines counts the lines it did not. The response's order is extract, and its extract object names the model and the tokens it used. When the model cannot be reached, the usual read is returned with extract.error set.
Read in order from this block: the nextStartBlock of a previous read, or 0 for the top. Takes precedence over query. In thread mode it applies to the record at startRecord; later records are read from their start.
What you are looking for in the record. When the record does not fit in maxChars, the blocks most relevant to it are shown first and the skipped ranges are marked.
record (default) reads this record. thread reads every record of the Slack thread this message belongs to, oldest first. A Slack record in no single thread reads as itself, then the threads its messages started (at most 10). A record that is not from Slack answers 422.
Thread mode: start at this record of the thread, the nextStartRecord of a previous read. Pass the read's nextStartBlock with it.
Response
Successful operation. When the record exists but its content is not indexed yet, content describes the record (name, link, dates) and ends with a Not indexed: paragraph naming its indexing status. When the record is indexed but its stored content could not be loaded, content is the literal No record found. Neither is an error status. An id that does not exist, or a record the caller may not read, answers 403.
Changes
- warning
added the new
extractenum value to theresponse property for the response status - info
added the new optional
queryrequest parameterextract - info
added the non-success response with the status
- info
added the non-success response with the status
- info
added the optional property
to the response with the status
- warning
- info
added the optional property
to the response with the status - info
added the optional property
to the response with the status
- info