---
title: "Retrieve a record"
method: GET
path: "/v1beta/versions/{version_id}/record"
tags: ["Versions"]
---

# Retrieve a record

`GET /v1beta/versions/{version_id}/record`

Retrieves the processed content record for a given version. The content oneof is populated based on source_format: document formats (pdf, docx, markdown) populate the document field; spreadsheet formats (xlsx, csv) populate the spreadsheet field.

## Path parameters

- `version_id` string, required — Version ID to retrieve the record for. Pattern: ver_[0-9a-hjkmnp-tv-z]{26}

## Response `200`

Success

- union
  - object — GetRecordResponse contains the processed content and layout for a version. The content oneof is populated based on source_format: - document formats (pdf, docx, markdown): document field - spreadsheet formats (xlsx, csv): spreadsheet field
    - `id` string — Unique record ID (UUID format).
    - `source_format` string — Source format of the original upload (e.g., pdf, docx, xlsx, csv).
    - `document` DocumentBundle, required — DocumentBundle groups a document record with its optional spatial layout.
      - `layout` QcrV1alphaDocumentLayout — Top-level layout structure, joined to a DocumentRecord by record_id. Used with the Block-based record representation (DocumentRecord.blocks).
        - `bindings` QcrV1alphaLayoutBinding[] — sparse element → layout entries
          - union
            - object — LayoutBinding attaches layout data to a specific element in the record. One binding per addressable element. Elements without layout data have no binding entry (sparse).
              - …
            - object — LayoutBinding attaches layout data to a specific element in the record. One binding per addressable element. Elements without layout data have no binding entry (sparse).
              - …
            - object — LayoutBinding attaches layout data to a specific element in the record. One binding per addressable element. Elements without layout data have no binding entry (sparse).
              - …
            - object — LayoutBinding attaches layout data to a specific element in the record. One binding per addressable element. Elements without layout data have no binding entry (sparse).
              - …
        - `defaults` QcrV1alphaLayoutDefaults — Document-wide layout defaults.
          - `dimensions` QcrV1alphaPhysicalDimensions — Physical dimensions in millimeters.
            - `height_mm` number, float
            - `width_mm` number, float
          - `direction` 'DIRECTION_UNSPECIFIED' | 'DIRECTION_LTR' | 'DIRECTION_RTL' — Text direction / reading order.
          - `margins` QcrV1alphaMargins — Page/section margins in millimeters.
            - `bottom_mm` number, float
            - `left_mm` number, float
            - `right_mm` number, float
            - `top_mm` number, float
          - `orientation` 'ORIENTATION_UNSPECIFIED' | 'ORIENTATION_PORTRAIT' | 'ORIENTATION_LANDSCAPE'
          - `page_size` 'PAGE_SIZE_UNSPECIFIED' | 'PAGE_SIZE_A4' | 'PAGE_SIZE_LETTER' | 'PAGE_SIZE_LEGAL' | 'PAGE_SIZE_A3' | 'PAGE_SIZE_TABLOID' | 'PAGE_SIZE_CUSTOM'
        - `extracted_at` string, date-time
        - `pages` QcrV1alphaPageGeometry[] — page-level geometry (all pages)
          - `dimensions` QcrV1alphaPhysicalDimensions — Physical dimensions in millimeters.
            - `height_mm` number, float
            - `width_mm` number, float
          - `orientation` 'ORIENTATION_UNSPECIFIED' | 'ORIENTATION_PORTRAIT' | 'ORIENTATION_LANDSCAPE'
          - `page_number` integer — 0-indexed
        - `record_id` string — references DocumentRecord.id
        - `source` QcrV1alphaSourceReference — SourceReference links a record back to the source it was extracted from. Three typed fields identify WHAT, WHERE, and WHEN. Everything else — format, content hash, storage location, checksums, external URLs — goes in the attributes bag, because the relevant metadata varies by source type. Examples by source type: File upload: source_id = "intg_01j8k..." (upload channel instance) remote_id = "req_01h2xcejqtf2nbrexx3vqjhp41" (upload request ID) attributes = {format: "pdf", location: "uploads/.../original.pdf", content_hash: "a1b2c3...", storage_etag: "\"abc\""} Gmail integration: source_id = "intg_01k9m..." (Gmail connector instance) remote_id = "18abc123def" (Gmail message ID) attributes = {format: "eml", thread_id: "...", external_url: "https://mail.google.com/..."} Confluence sync: source_id = "intg_01p3q..." (Confluence connector instance) remote_id = "12345678" (Confluence page ID) attributes = {format: "html", space_key: "ENG", external_url: "https://acme.atlassian.net/wiki/..."}
          - `attributes` Struct — `Struct` represents a structured data value, consisting of fields which map to dynamically typed values. In some languages, `Struct` might be supported by a native representation. For example, in scripting languages like JS a struct is represented as an object. The details of that representation are described together with the proto support for the language. The JSON representation for `Struct` is JSON object.
          - `ingested_at` string, date-time — When this content was ingested into the system.
          - `remote_id` string — The content's coordinates in the external system — whatever identifier the source system uses for this specific piece of content. Examples: upload request ID, Gmail message ID, Confluence page ID, S3 object key, Merge remote_id.
          - `source_id` string — Identifies the integration or connector instance that produced this record. Stable across re-syncs of the same source. Example: "intg_01j8k..." (opaque ID from integration registry).
      - `record` QcrV1alphaDocumentRecord — DocumentRecord is the QCR representation of an ingested document. Immutable once extracted. Source-format-agnostic. Structure is a flat sequence of blocks. Sections provide optional grouping and can nest, but block-level elements (paragraphs, tables, etc.) are leaves — they do not contain other blocks. This constrains nesting to only what is semantically valid and gives every element a natural positional address. Addressing convention: every element is addressable by its index path through the typed containment hierarchy. Examples: blocks[2] → third block blocks[2].section.blocks[0] → first block inside a section blocks[4].table.rows[1].cells[0] → second row, first cell of a table blocks[3].list.items[2] → third item of a list These addresses are deterministic for a given record and are used by DocumentLayout to join layout data to semantic content.
        - `blocks` QcrV1alphaBlock[]
          - union
            - object — Block is the unit of document content. Each block carries exactly one type-specific payload via oneof. Blocks do not nest generically — only SectionData can contain child blocks, enforcing valid containment at the schema level.
              - …
            - object — Block is the unit of document content. Each block carries exactly one type-specific payload via oneof. Blocks do not nest generically — only SectionData can contain child blocks, enforcing valid containment at the schema level.
              - …
            - object — Block is the unit of document content. Each block carries exactly one type-specific payload via oneof. Blocks do not nest generically — only SectionData can contain child blocks, enforcing valid containment at the schema level.
              - …
            - object — Block is the unit of document content. Each block carries exactly one type-specific payload via oneof. Blocks do not nest generically — only SectionData can contain child blocks, enforcing valid containment at the schema level.
              - …
            - object — Block is the unit of document content. Each block carries exactly one type-specific payload via oneof. Blocks do not nest generically — only SectionData can contain child blocks, enforcing valid containment at the schema level.
              - …
            - object — Block is the unit of document content. Each block carries exactly one type-specific payload via oneof. Blocks do not nest generically — only SectionData can contain child blocks, enforcing valid containment at the schema level.
              - …
            - object — Block is the unit of document content. Each block carries exactly one type-specific payload via oneof. Blocks do not nest generically — only SectionData can contain child blocks, enforcing valid containment at the schema level.
              - …
            - object — Block is the unit of document content. Each block carries exactly one type-specific payload via oneof. Blocks do not nest generically — only SectionData can contain child blocks, enforcing valid containment at the schema level.
              - …
            - object — Block is the unit of document content. Each block carries exactly one type-specific payload via oneof. Blocks do not nest generically — only SectionData can contain child blocks, enforcing valid containment at the schema level.
              - …
            - object — Block is the unit of document content. Each block carries exactly one type-specific payload via oneof. Blocks do not nest generically — only SectionData can contain child blocks, enforcing valid containment at the schema level.
              - …
            - object — Block is the unit of document content. Each block carries exactly one type-specific payload via oneof. Blocks do not nest generically — only SectionData can contain child blocks, enforcing valid containment at the schema level.
              - …
        - `id` string
        - `metadata` QcrV1alphaDocumentMetadata
          - `attributes` Struct — `Struct` represents a structured data value, consisting of fields which map to dynamically typed values. In some languages, `Struct` might be supported by a native representation. For example, in scripting languages like JS a struct is represented as an object. The details of that representation are described together with the proto support for the language. The JSON representation for `Struct` is JSON object.
          - `extracted_at` string, date-time
          - `language` string
          - `title` string
        - `source` QcrV1alphaSourceReference — SourceReference links a record back to the source it was extracted from. Three typed fields identify WHAT, WHERE, and WHEN. Everything else — format, content hash, storage location, checksums, external URLs — goes in the attributes bag, because the relevant metadata varies by source type. Examples by source type: File upload: source_id = "intg_01j8k..." (upload channel instance) remote_id = "req_01h2xcejqtf2nbrexx3vqjhp41" (upload request ID) attributes = {format: "pdf", location: "uploads/.../original.pdf", content_hash: "a1b2c3...", storage_etag: "\"abc\""} Gmail integration: source_id = "intg_01k9m..." (Gmail connector instance) remote_id = "18abc123def" (Gmail message ID) attributes = {format: "eml", thread_id: "...", external_url: "https://mail.google.com/..."} Confluence sync: source_id = "intg_01p3q..." (Confluence connector instance) remote_id = "12345678" (Confluence page ID) attributes = {format: "html", space_key: "ENG", external_url: "https://acme.atlassian.net/wiki/..."}
          - `attributes` Struct — `Struct` represents a structured data value, consisting of fields which map to dynamically typed values. In some languages, `Struct` might be supported by a native representation. For example, in scripting languages like JS a struct is represented as an object. The details of that representation are described together with the proto support for the language. The JSON representation for `Struct` is JSON object.
          - `ingested_at` string, date-time — When this content was ingested into the system.
          - `remote_id` string — The content's coordinates in the external system — whatever identifier the source system uses for this specific piece of content. Examples: upload request ID, Gmail message ID, Confluence page ID, S3 object key, Merge remote_id.
          - `source_id` string — Identifies the integration or connector instance that produced this record. Stable across re-syncs of the same source. Example: "intg_01j8k..." (opaque ID from integration registry).
  - object — GetRecordResponse contains the processed content and layout for a version. The content oneof is populated based on source_format: - document formats (pdf, docx, markdown): document field - spreadsheet formats (xlsx, csv): spreadsheet field
    - `id` string — Unique record ID (UUID format).
    - `source_format` string — Source format of the original upload (e.g., pdf, docx, xlsx, csv).
    - `spreadsheet` SpreadsheetBundle, required — SpreadsheetBundle groups a spreadsheet record with its optional grid layout.
      - `layout` QcrV1alphaSpreadsheetLayout
        - `defaults` QcrV1alphaSpreadsheetLayoutDefaults
          - `column_width_mm` number, float
          - `row_height_mm` number, float
        - `extracted_at` string, date-time
        - `record_id` string
        - `sheet_layouts` QcrV1alphaSheetLayout[]
          - `cell_bindings` QcrV1alphaCellLayoutBinding[]
            - `alignment` union
              - …
            - `col` integer
            - `row` integer
            - `text_wrap` boolean
          - `column_formats` QcrV1alphaColumnFormatBinding[]
            - `column_index` integer — index into DataTable.columns[]
            - `number_format_category` 'NUMBER_FORMAT_CATEGORY_UNSPECIFIED' | 'NUMBER_FORMAT_CATEGORY_GENERAL' | 'NUMBER_FORMAT_CATEGORY_NUMBER' | 'NUMBER_FORMAT_CATEGORY_CURRENCY' | 'NUMBER_FORMAT_CATEGORY_ACCOUNTING' | 'NUMBER_FORMAT_CATEGORY_PERCENTAGE' | 'NUMBER_FORMAT_CATEGORY_FRACTION' | 'NUMBER_FORMAT_CATEGORY_SCIENTIFIC' | 'NUMBER_FORMAT_CATEGORY_TEXT' | 'NUMBER_FORMAT_CATEGORY_DATE' | 'NUMBER_FORMAT_CATEGORY_TIME' | 'NUMBER_FORMAT_CATEGORY_DATE_TIME' | 'NUMBER_FORMAT_CATEGORY_DURATION'
            - `number_format_pattern` string — e.g. "#,##0.00", "yyyy-mm-dd", "0.00%"
            - `table_name` string — references DataTable.name
          - `columns` QcrV1alphaColumnLayout[]
            - `col` integer
            - `is_hidden` boolean
            - `width_mm` number, float
          - `direction` 'DIRECTION_UNSPECIFIED' | 'DIRECTION_LTR' | 'DIRECTION_RTL' — Text direction / reading order.
          - `frozen_pane` QcrV1alphaFrozenPane
            - `frozen_col` integer — 0 = no col freeze; N = cols 0..N-1 frozen
            - `frozen_row` integer — 0 = no row freeze; N = rows 0..N-1 frozen
          - `is_hidden` boolean
          - `merged_regions` QcrV1alphaMergedRegion[]
            - `end_col` integer
            - `end_row` integer
            - `start_col` integer
            - `start_row` integer
          - `rows` QcrV1alphaRowLayout[]
            - `height_mm` number, float
            - `is_hidden` boolean
            - `row` integer
          - `sheet_name` string — references Sheet.name
        - `source` QcrV1alphaSourceReference — SourceReference links a record back to the source it was extracted from. Three typed fields identify WHAT, WHERE, and WHEN. Everything else — format, content hash, storage location, checksums, external URLs — goes in the attributes bag, because the relevant metadata varies by source type. Examples by source type: File upload: source_id = "intg_01j8k..." (upload channel instance) remote_id = "req_01h2xcejqtf2nbrexx3vqjhp41" (upload request ID) attributes = {format: "pdf", location: "uploads/.../original.pdf", content_hash: "a1b2c3...", storage_etag: "\"abc\""} Gmail integration: source_id = "intg_01k9m..." (Gmail connector instance) remote_id = "18abc123def" (Gmail message ID) attributes = {format: "eml", thread_id: "...", external_url: "https://mail.google.com/..."} Confluence sync: source_id = "intg_01p3q..." (Confluence connector instance) remote_id = "12345678" (Confluence page ID) attributes = {format: "html", space_key: "ENG", external_url: "https://acme.atlassian.net/wiki/..."}
          - `attributes` Struct — `Struct` represents a structured data value, consisting of fields which map to dynamically typed values. In some languages, `Struct` might be supported by a native representation. For example, in scripting languages like JS a struct is represented as an object. The details of that representation are described together with the proto support for the language. The JSON representation for `Struct` is JSON object.
          - `ingested_at` string, date-time — When this content was ingested into the system.
          - `remote_id` string — The content's coordinates in the external system — whatever identifier the source system uses for this specific piece of content. Examples: upload request ID, Gmail message ID, Confluence page ID, S3 object key, Merge remote_id.
          - `source_id` string — Identifies the integration or connector instance that produced this record. Stable across re-syncs of the same source. Example: "intg_01j8k..." (opaque ID from integration registry).
      - `record` QcrV1alphaSpreadsheetRecord — SpreadsheetRecord is the QCR representation of an ingested spreadsheet workbook (XLSX, CSV, Parquet). Immutable once extracted. Source-format-agnostic. Hierarchy: SpreadsheetRecord 1:M Sheet 1:M DataTable/SheetImage/SheetChart. The semantic core is DataTable: named, typed columns applied to ordered rows. The extractor identifies headers and schemas so consumers don't have to.
        - `id` string
        - `metadata` QcrV1alphaSpreadsheetMetadata
          - `attributes` Struct — `Struct` represents a structured data value, consisting of fields which map to dynamically typed values. In some languages, `Struct` might be supported by a native representation. For example, in scripting languages like JS a struct is represented as an object. The details of that representation are described together with the proto support for the language. The JSON representation for `Struct` is JSON object.
          - `extracted_at` string, date-time
          - `title` string
        - `named_ranges` QcrV1alphaNamedRange[]
          - `attributes` Struct — `Struct` represents a structured data value, consisting of fields which map to dynamically typed values. In some languages, `Struct` might be supported by a native representation. For example, in scripting languages like JS a struct is represented as an object. The details of that representation are described together with the proto support for the language. The JSON representation for `Struct` is JSON object.
          - `name` string
          - `range_ref` string — A1-notation
          - `sheet_name` string — empty = workbook-scoped
        - `sheets` QcrV1alphaSheet[]
          - `attributes` Struct — `Struct` represents a structured data value, consisting of fields which map to dynamically typed values. In some languages, `Struct` might be supported by a native representation. For example, in scripting languages like JS a struct is represented as an object. The details of that representation are described together with the proto support for the language. The JSON representation for `Struct` is JSON object.
          - `charts` QcrV1alphaSheetChart[]
            - `anchor_col` integer
            - `anchor_row` integer
            - `attributes` Struct — `Struct` represents a structured data value, consisting of fields which map to dynamically typed values. In some languages, `Struct` might be supported by a native representation. For example, in scripting languages like JS a struct is represented as an object. The details of that representation are described together with the proto support for the language. The JSON representation for `Struct` is JSON object.
            - `chart_type` string — e.g., "bar", "line", "pie"
            - `rendered` QcrV1alphaVectorImageData — VectorImageData represents a vector graphic (SVG, diagram, chart).
              - …
            - `source_ranges` string[] — A1-notation data ranges
            - `title` string
          - `images` QcrV1alphaSheetImage[]
            - `anchor_col` integer
            - `anchor_row` integer
            - `height_mm` number, float
            - `image` QcrV1alphaRasterImageData — RasterImageData represents a raster image (PNG, JPEG, WebP, etc.).
              - …
            - `offset_x_mm` number, float — horizontal offset within anchor cell
            - `offset_y_mm` number, float — vertical offset within anchor cell
            - `width_mm` number, float
          - `name` string — unique within workbook, used as join key by SheetLayout
          - `tables` QcrV1alphaDataTable[]
            - `attributes` Struct — `Struct` represents a structured data value, consisting of fields which map to dynamically typed values. In some languages, `Struct` might be supported by a native representation. For example, in scripting languages like JS a struct is represented as an object. The details of that representation are described together with the proto support for the language. The JSON representation for `Struct` is JSON object.
            - `columns` QcrV1alphaColumnDef[] — the schema
              - …
            - `has_total_row` boolean
            - `name` string — from ListObject or extractor-assigned
            - `range_ref` string — A1-notation origin, e.g. "A1:D100"
            - `rows` QcrV1alphaDataRow[] — ordered data rows (excludes header)
              - …
        - `source` QcrV1alphaSourceReference — SourceReference links a record back to the source it was extracted from. Three typed fields identify WHAT, WHERE, and WHEN. Everything else — format, content hash, storage location, checksums, external URLs — goes in the attributes bag, because the relevant metadata varies by source type. Examples by source type: File upload: source_id = "intg_01j8k..." (upload channel instance) remote_id = "req_01h2xcejqtf2nbrexx3vqjhp41" (upload request ID) attributes = {format: "pdf", location: "uploads/.../original.pdf", content_hash: "a1b2c3...", storage_etag: "\"abc\""} Gmail integration: source_id = "intg_01k9m..." (Gmail connector instance) remote_id = "18abc123def" (Gmail message ID) attributes = {format: "eml", thread_id: "...", external_url: "https://mail.google.com/..."} Confluence sync: source_id = "intg_01p3q..." (Confluence connector instance) remote_id = "12345678" (Confluence page ID) attributes = {format: "html", space_key: "ENG", external_url: "https://acme.atlassian.net/wiki/..."}
          - `attributes` Struct — `Struct` represents a structured data value, consisting of fields which map to dynamically typed values. In some languages, `Struct` might be supported by a native representation. For example, in scripting languages like JS a struct is represented as an object. The details of that representation are described together with the proto support for the language. The JSON representation for `Struct` is JSON object.
          - `ingested_at` string, date-time — When this content was ingested into the system.
          - `remote_id` string — The content's coordinates in the external system — whatever identifier the source system uses for this specific piece of content. Examples: upload request ID, Gmail message ID, Confluence page ID, S3 object key, Merge remote_id.
          - `source_id` string — Identifies the integration or connector instance that produced this record. Stable across re-syncs of the same source. Example: "intg_01j8k..." (opaque ID from integration registry).

## Other responses

- `400` — Invalid request parameters
- `401` — Authentication failed - missing or invalid API key
- `403` — Authorization failed - valid key but insufficient permissions
- `404` — Resource not found
- `429` — Too many requests
- `500` — Internal server error

## Changes

- **2026-04-13** `96e3f520e606` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/factify-inc/apis/factify-api/changes/v1beta/versions/:version_id/record/get.md)

---

[API](https://skmtc.dev/factify-inc/apis/factify-api.md) · [All operations](https://skmtc.dev/factify-inc/apis/factify-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/factify-inc/factify-api/revisions/8baabdfb82bf/schema)
