---
title: "Returns a chronologically interleaved list of project rows and standalone print rows for the current user, with optional filtering and sorting."
method: GET
path: "/api/Prints/grouped"
tags: ["Prints"]
---

# Returns a chronologically interleaved list of project rows and standalone print rows for the current user, with optional filtering and sorting.

`GET /api/Prints/grouped`

## Request

- Base URL: `https://api.3dprintlog.com`
- URL: `https://api.3dprintlog.com/api/Prints/grouped`
- Auth: one of:
  - OAuth 2 (authorization code, authorization URL `https://3dprintlog.auth0.com/authorize`, token URL `https://3dprintlog.auth0.com/oauth/token`)
  - API key in header `X-Api-Key`
  - API key in query parameter `api_key`

## Query parameters

- `pageNumber` integer
- `pageSize` integer
- `searchText` string
- `filterByPrinterIds` integer[]
- `filterByFilamentIds` string[]
- `filterByStatus` 1 | 2 | 3 | 4 | 5 | 6: Sent as an integer: `1` = Pending, `2` = Printing, `3` = Success, `4` = Cancelled, `5` = Failed, `6` = PartialSuccess.
- `SortDirection` 1 | 2: Sent as an integer: `1` = Asc, `2` = Desc.
- `SortColumn` 1 | 2 | 3: Sent as an integer: `1` = Title, `2` = StartDate, `3` = FilamentUsage.

## Response `200`

OK

- PrintLogApiModelsPagedListOfPrintLogApiModelsDTOsPrintGroupedFeedItemDto: `[ImmutableObject(true)]` is here for HybridCache and nothing else. It is inert at runtime; the attribute is how HybridCache is told it may hand the same instance to every caller instead of storing a serialized copy in L1 and deserializing it on each hit. Without it a cache <i>hit</i> would pay a full JSON deserialize. That is the cost #66 declined to spend on the serialize side, and it would land on the endpoints whose expensive part — the SQL aggregation — the cache already skips. <b>Be clear about what it does and does not claim.</b> This type is mutable — both properties have setters and `Items` is a mutable `List<T>` — so the attribute is a statement of convention, not a property the compiler enforces: nothing mutates a `PagedList` it read out of the cache, and nothing may start. What it is not is a new risk. A cached `PagedList` was already shared by reference across concurrent requests under plain `IMemoryCache`; the attribute keeps that exact behaviour rather than introducing it. The only alternative is letting HybridCache serialize and re-deserialize per hit, which is a real cost paid on every request to buy protection against a mutation that does not happen. Treat anything returned from a cache lookup as read-only, and if a caller ever genuinely needs to mutate one, copy it first.
  - `paging` PrintLogApiModelsPageInfo
    - `currentPage` integer
    - `totalPages` integer
    - `pageSize` integer
    - `totalCount` integer
  - `items` PrintLogApiModelsDTOsPrintGroupedFeedItemDto[], nullable
    - `type` string, nullable: "project" or "print"
    - `sortDate` string, date-time: Used for chronological sort across both types.
    - `projectId` string, uuid, nullable
    - `projectStartDate` string, date, nullable: The project's RESOLVED start date as a civil date. Populated for project rows only.
    - `projectName` string, nullable
    - `projectReference` string, nullable
    - `projectStatus` 1 | 2 | 3 | 4: Sent as an integer: `1` = InProgress, `2` = Complete, `3` = OnHold, `4` = Cancelled.
    - `printCount` integer, nullable: Total prints in this project (unfiltered).
    - `filteredPrintCount` integer, nullable: Prints in this project matching the current filters. Null when no filters are active (all prints match).
    - `totalPrintTimeInSeconds` integer, nullable
    - `totalEstimatedPrintTimeInSeconds` integer, nullable
    - `totalFilamentWeightMg` integer, nullable
    - `defaultProjectImageId` integer, nullable
    - `filamentUsage` PrintLogApiModelsDTOsPrintPrintFilamentSummaryDto[], nullable: Aggregated filament usage across all prints in this project, grouped by FilamentId with weights summed.
      - `id` string, uuid
      - `filament` PrintLogApiModelsDTOsFilamentFilamentSummaryDto
        - `id` string, uuid
        - `spoolNumber` integer, nullable: The user's own number for this spool (1, 2, 3…), which Spoolman clients use as its id. Read-only: assigned on create, never reused, and ignored on PUT.
        - `displayName` string, nullable: Common name for the roll of filament.
        - `brand` string, nullable
        - `materialType` string, nullable: The material Type, ie PLA, PETG, ABS.
        - `materialCategory` PrintLogApiModelsDTOsMaterialCategoryMaterialCategoryDto: The category of materials, such as filament, resin, powder, etc.
          - `nickname` string, nullable: The nickname of the material category
          - `name` string, nullable: The long form name of the category
          - `description` string, nullable: A description of that category
          - `hasDiameter` boolean: Whether this material has a diameter
          - `showNozzleTemperature` boolean
          - `showBedTemperature` boolean
          - `showMeltingTemperature` boolean
          - `showRecommendedInitialLayerTimeInSeconds` boolean
          - `showRecommendedLayerTimeInSeconds` boolean
          - `showMaterialRefreshRatio` boolean: The percentage of new powder when mixing with old powder
          - `showInertGas` boolean
        - `materialDensityGramPerCubicCm` number, double: The Density of the Material
        - `colorName` string, nullable
        - `colorHex` string, nullable
        - `recommendedTemp` number, double, nullable: The user's recommended temperature
        - `isActive` boolean
        - `notes` string, nullable
        - `createdDate` string, date-time
        - `filamentRemaining` integer, nullable
        - `filamentLengthRemainingInM` number, double, nullable: Converted from FilamentRemaining rather than accumulated separately, so the list and the detail page cannot disagree. See FilamentDetailDto for why the per-usage volume and length columns are not summed. Get-only: computed on read.
        - `filamentVolumeRemainingInMl` number, double, nullable
        - `purchasePriceValue` string, nullable: Any notes about the purchase price
        - `initialNominalWeightMg` integer, nullable
        - `diameterMm` number, double, nullable
        - `loadedInPrinter` PrintLogApiModelsDTOsPrinterPrinterSummaryWithoutCategory
          - `id` integer
          - `name` string, nullable
          - `make` string, nullable
          - `model` string, nullable
          - `isActive` boolean
        - `storageLocation` string, nullable
        - `isFavorite` boolean
        - `colorPattern` 1 | 2 | 3 | 4: Sent as an integer: `1` = Solid, `2` = Multi, `3` = Gradient, `4` = Rainbow.
        - `finishType` 1 | 2 | 3: Sent as an integer: `1` = Standard, `2` = Silk, `3` = Matte.
        - `colors` string[], nullable
        - `effects` PrintLogApiEnumsFilamentEffect[], nullable
        - `defaultImageThumbnailUrl` string, nullable: Signed thumbnail URL for the default image. Populated ONLY by FilamentService's explicit hydration for the owner's filament list. Null everywhere else — including inside print responses, which are anonymous. Never populate this via AutoMapper.
      - `slot` integer, nullable: The printer slot (tool) the material was fed from, if known.
      - `estimatedAmountMg` integer, nullable
      - `amountMg` integer, nullable
      - `estimatedLengthInM` number, double, nullable: The estimated length of filament used in meters.
      - `lengthInM` number, double, nullable: The actual length of filament used in meters.
      - `estimatedVolumeMl` number, double, nullable: The estimated volume of filament used in milliliters.
      - `volumeMl` number, double, nullable: The actual volume of filament used in milliliters
      - `isEstimatedLengthSource` boolean: Determines if the user entered the length as the "source of truth", or weight. True means the user entered the filament usage as a length, while false means the user entered usage as Mg.
      - `isActualLengthSource` boolean: Determines if the user entered the length as the "source of truth", or weight. True means the user entered the filament usage as a length, while false means the user entered usage as Mg.
      - `estimatedSource` 1 | 2 | 3: Which field is the user-entered "source" Sent as an integer: `1` = Weight, `2` = Length, `3` = Volume.
      - `source` 1 | 2 | 3: Which field is the user-entered "source" Sent as an integer: `1` = Weight, `2` = Length, `3` = Volume.
      - `notes` string, nullable
    - `printers` PrintLogApiModelsDTOsPrinterPrinterSummary[], nullable: Distinct printers used across all prints in this project.
      - `id` integer
      - `name` string, nullable
      - `make` string, nullable
      - `model` string, nullable
      - `isActive` boolean
      - `wattageW` number, double, nullable
      - `printTimeInSeconds` integer, nullable
      - `category` PrintLogApiModelsDTOsPrinterCategoryPrinterCategoryDto: The class/category/type of 3D printing technology, such as FDM, SLA, etc
        - `nickname` string, nullable: The nickname of the category
        - `name` string, nullable: The long form name of the category
        - `description` string, nullable: A description of that category
        - `materialCategory` PrintLogApiModelsDTOsMaterialCategoryMaterialCategoryDto: The category of materials, such as filament, resin, powder, etc.
          - `nickname` string, nullable: The nickname of the material category
          - `name` string, nullable: The long form name of the category
          - `description` string, nullable: A description of that category
          - `hasDiameter` boolean: Whether this material has a diameter
          - `showNozzleTemperature` boolean
          - `showBedTemperature` boolean
          - `showMeltingTemperature` boolean
          - `showRecommendedInitialLayerTimeInSeconds` boolean
          - `showRecommendedLayerTimeInSeconds` boolean
          - `showMaterialRefreshRatio` boolean: The percentage of new powder when mixing with old powder
          - `showInertGas` boolean
        - `showNozzleDiameter` boolean
        - `showFilamentDiameter` boolean
        - `showBeamDiameter` boolean
        - `showBedSize` boolean
        - `showScreenResolution` boolean
        - `showHasHeatedBed` boolean
        - `showHasHeatedChamber` boolean
    - `print` PrintLogApiModelsDTOsPrintPrintSummaryDTO
      - `id` integer
      - `title` string, nullable
      - `printer` PrintLogApiModelsDTOsPrinterPrinterSummary
        - `id` integer
        - `name` string, nullable
        - `make` string, nullable
        - `model` string, nullable
        - `isActive` boolean
        - `wattageW` number, double, nullable
        - `printTimeInSeconds` integer, nullable
        - `category` PrintLogApiModelsDTOsPrinterCategoryPrinterCategoryDto: The class/category/type of 3D printing technology, such as FDM, SLA, etc
          - `nickname` string, nullable: The nickname of the category
          - `name` string, nullable: The long form name of the category
          - `description` string, nullable: A description of that category
          - `materialCategory` PrintLogApiModelsDTOsMaterialCategoryMaterialCategoryDto: The category of materials, such as filament, resin, powder, etc.
            - `nickname` string, nullable: The nickname of the material category
            - `name` string, nullable: The long form name of the category
            - `description` string, nullable: A description of that category
            - `hasDiameter` boolean: Whether this material has a diameter
            - `showNozzleTemperature` boolean
            - `showBedTemperature` boolean
            - `showMeltingTemperature` boolean
            - `showRecommendedInitialLayerTimeInSeconds` boolean
            - `showRecommendedLayerTimeInSeconds` boolean
            - `showMaterialRefreshRatio` boolean: The percentage of new powder when mixing with old powder
            - `showInertGas` boolean
          - `showNozzleDiameter` boolean
          - `showFilamentDiameter` boolean
          - `showBeamDiameter` boolean
          - `showBedSize` boolean
          - `showScreenResolution` boolean
          - `showHasHeatedBed` boolean
          - `showHasHeatedChamber` boolean
      - `startDate` string, date-time, nullable
      - `status` 1 | 2 | 3 | 4 | 5 | 6: Sent as an integer: `1` = Pending, `2` = Printing, `3` = Success, `4` = Cancelled, `5` = Failed, `6` = PartialSuccess.
      - `estimatedPrintTimeInSeconds` integer, nullable
      - `printTimeInSeconds` integer, nullable
      - `filamentUsage` PrintLogApiModelsDTOsPrintPrintFilamentSummaryDto[], nullable
        - `id` string, uuid
        - `filament` PrintLogApiModelsDTOsFilamentFilamentSummaryDto
          - `id` string, uuid
          - `spoolNumber` integer, nullable: The user's own number for this spool (1, 2, 3…), which Spoolman clients use as its id. Read-only: assigned on create, never reused, and ignored on PUT.
          - `displayName` string, nullable: Common name for the roll of filament.
          - `brand` string, nullable
          - `materialType` string, nullable: The material Type, ie PLA, PETG, ABS.
          - `materialCategory` PrintLogApiModelsDTOsMaterialCategoryMaterialCategoryDto: The category of materials, such as filament, resin, powder, etc.
            - `nickname` string, nullable: The nickname of the material category
            - `name` string, nullable: The long form name of the category
            - `description` string, nullable: A description of that category
            - `hasDiameter` boolean: Whether this material has a diameter
            - `showNozzleTemperature` boolean
            - `showBedTemperature` boolean
            - `showMeltingTemperature` boolean
            - `showRecommendedInitialLayerTimeInSeconds` boolean
            - `showRecommendedLayerTimeInSeconds` boolean
            - `showMaterialRefreshRatio` boolean: The percentage of new powder when mixing with old powder
            - `showInertGas` boolean
          - `materialDensityGramPerCubicCm` number, double: The Density of the Material
          - `colorName` string, nullable
          - `colorHex` string, nullable
          - `recommendedTemp` number, double, nullable: The user's recommended temperature
          - `isActive` boolean
          - `notes` string, nullable
          - `createdDate` string, date-time
          - `filamentRemaining` integer, nullable
          - `filamentLengthRemainingInM` number, double, nullable: Converted from FilamentRemaining rather than accumulated separately, so the list and the detail page cannot disagree. See FilamentDetailDto for why the per-usage volume and length columns are not summed. Get-only: computed on read.
          - `filamentVolumeRemainingInMl` number, double, nullable
          - `purchasePriceValue` string, nullable: Any notes about the purchase price
          - `initialNominalWeightMg` integer, nullable
          - `diameterMm` number, double, nullable
          - `loadedInPrinter` PrintLogApiModelsDTOsPrinterPrinterSummaryWithoutCategory
            - `id` integer
            - `name` string, nullable
            - `make` string, nullable
            - `model` string, nullable
            - `isActive` boolean
          - `storageLocation` string, nullable
          - `isFavorite` boolean
          - `colorPattern` 1 | 2 | 3 | 4: Sent as an integer: `1` = Solid, `2` = Multi, `3` = Gradient, `4` = Rainbow.
          - `finishType` 1 | 2 | 3: Sent as an integer: `1` = Standard, `2` = Silk, `3` = Matte.
          - `colors` string[], nullable
          - `effects` PrintLogApiEnumsFilamentEffect[], nullable
          - `defaultImageThumbnailUrl` string, nullable: Signed thumbnail URL for the default image. Populated ONLY by FilamentService's explicit hydration for the owner's filament list. Null everywhere else — including inside print responses, which are anonymous. Never populate this via AutoMapper.
        - `slot` integer, nullable: The printer slot (tool) the material was fed from, if known.
        - `estimatedAmountMg` integer, nullable
        - `amountMg` integer, nullable
        - `estimatedLengthInM` number, double, nullable: The estimated length of filament used in meters.
        - `lengthInM` number, double, nullable: The actual length of filament used in meters.
        - `estimatedVolumeMl` number, double, nullable: The estimated volume of filament used in milliliters.
        - `volumeMl` number, double, nullable: The actual volume of filament used in milliliters
        - `isEstimatedLengthSource` boolean: Determines if the user entered the length as the "source of truth", or weight. True means the user entered the filament usage as a length, while false means the user entered usage as Mg.
        - `isActualLengthSource` boolean: Determines if the user entered the length as the "source of truth", or weight. True means the user entered the filament usage as a length, while false means the user entered usage as Mg.
        - `estimatedSource` 1 | 2 | 3: Which field is the user-entered "source" Sent as an integer: `1` = Weight, `2` = Length, `3` = Volume.
        - `source` 1 | 2 | 3: Which field is the user-entered "source" Sent as an integer: `1` = Weight, `2` = Length, `3` = Volume.
        - `notes` string, nullable
      - `sumActualFilamentWeightMg` integer
      - `sumEstimatedFilamentWeightMg` integer
      - `totalFilamentWeightMg` integer
      - `createdByUserId` integer
      - `defaultPrintImageId` integer
      - `commentCount` integer
      - `projectId` string, uuid, nullable
      - `projectName` string, nullable
      - `externalSource` string, nullable: The connector that logged this print, if any. Shown to the creator only.
      - `externalId` string, nullable: The job's id in PrintLogApi.Models.DTOs.Print.PrintSummaryDTO.ExternalSource. Shown to the creator only.

## Other responses

- `401`: Unauthorized
- `403`: Forbidden

---

[API](https://skmtc.dev/3dprintlog/apis/3d-print-log-api.md) · [All operations](https://skmtc.dev/3dprintlog/apis/3d-print-log-api/llms.txt) · [OpenAPI document](https://skmtc.dev/3dprintlog/apis/3d-print-log-api/revisions/dfc3a4df4e38?raw)
