---
title: "Get a paged list of the current user's projects."
method: GET
path: "/api/Projects"
tags: ["Projects"]
---

# Get a paged list of the current user's projects.

`GET /api/Projects`

## Request

- Base URL: `https://api.3dprintlog.com`
- URL: `https://api.3dprintlog.com/api/Projects`
- 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
- `search` string
- `status` 1 | 2 | 3 | 4: Sent as an integer: `1` = InProgress, `2` = Complete, `3` = OnHold, `4` = Cancelled.
- `sortBy` string

## Response `200`

OK

- PrintLogApiModelsPagedListOfPrintLogApiModelsDTOsProjectProjectSummaryDto: `[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` PrintLogApiModelsDTOsProjectProjectSummaryDto[], nullable
    - `id` string, uuid
    - `name` string, nullable
    - `reference` string, nullable
    - `status` 1 | 2 | 3 | 4: Sent as an integer: `1` = InProgress, `2` = Complete, `3` = OnHold, `4` = Cancelled.
    - `viewStatus` 1 | 2 | 3: Sent as an integer: `1` = Public, `2` = Unlisted, `3` = Private.
    - `createdDate` string, date-time
    - `printCount` integer
    - `totalPrintTimeInSeconds` integer
    - `totalEstimatedPrintTimeInSeconds` integer
    - `totalFilamentWeightMg` integer
    - `defaultImageId` integer
    - `startDate` string, date
    - `finishDate` string, date, nullable
    - `startDateOverride` string, date, nullable
    - `finishDateOverride` string, date, nullable

## 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)
