---
title: "List non-archived projects in a workspace (viewer+)"
method: GET
path: "/api/workspaces/{workspace_id}/projects"
tags: ["projects"]
---

# List non-archived projects in a workspace (viewer+)

`GET /api/workspaces/{workspace_id}/projects`

## Request

- Base URL: `https://api.hillstar.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.hillstar.ai/api/workspaces/{workspace_id}/projects`
- Auth: none declared

## Path parameters

- `workspace_id` integer, required: Workspace ID

## Response `200`

OK

- ProjectRead[], nullable
  - `$schema` string, uri: A URL to the JSON Schema for this object.
  - `created_at` string, date-time
  - `created_by_user_id` integer
  - `created_by_user_name` string
  - `current_rubric` RubricRead
    - `categories` EvaluationCategoryRead[]
      - `criteria` EvaluationCriterionRead[]
        - `description` string, required
        - `eval_guideline_index` integer, required
        - `id` integer
        - `importance` 'LOW' | 'MEDIUM' | 'HIGH': Importance level for evaluation criteria.
        - `name` string, required
        - `scope_keys` string[], required
        - `scoring_instructions` string, required
      - `description` string, required
      - `id` integer
      - `name` string, required
      - `sort_order` integer, required
      - `source_type` 'LIBRARY' | 'AI_SUGGESTED': Provenance of a rubric category or criterion.
      - `weight` integer
    - `created_by_user_id` integer, required
    - `created_by_user_name` string, required
    - `id` integer
    - `major_version` integer, required
    - `minor_version` integer, required
    - `project_id` integer, required
    - `version_comments` string, required
  - `evaluation_count` integer
  - `generated_date` string, date-time
  - `has_questionnaire` boolean
  - `id` integer
  - `is_archived` boolean
  - `parsed_questionnaire` object
  - `processing_error` string
  - `processing_status` string
  - `project_name` string, required
  - `questionnaire_file_url` string
  - `questionnaire_status` string
  - `questionnaire_views` QuestionnaireView[]
    - `kind` 'compliance_matrix' | 'gap_list' | 'evidence_card' | 'section_rollup', required: Block type; unknown kinds render as a visible placeholder, never silently.
    - `sheet_id` string
    - `title` string
  - `rubric_sources` Document[]
    - `file_id` integer: FK to the primary source file (get filename, type via join)
    - `sections` Section[], required: Document sections with chunks
      - `chunks` Chunk[], required: Indexed chunks for LLM reference
        - `chunk_type` 'sentence' | 'list_item' | 'title' | 'table' | 'table_row' | 'address' | 'narrative_text' | 'uncategorized', required: Element kind from the chunker (native office partitioners / composite PDF)
        - `depth` integer: Heading level from category_depth (titles only)
        - `extraction_method` string: Extraction pipeline that produced this chunk (HIL-595): hybrid, composite, ocr, unstructured, pypdf, or docai; nil on pre-existing chunks
        - `file_id` integer: FK to uploaded_files for this chunk's source (set on merged multi-file docs)
        - `index` integer, required: Zero-based index within the parent section
        - `machine_transcribed` boolean: True when the chunk text was transcribed from a page image by a model (scanned path); nil/false = copied from the document's own text layer
        - `marks` InlineMark[], nullable: Inline formatting spans (bold, italic, links)
          - `end` integer, required: Character offset, exclusive
          - `start` integer, required: Character offset, inclusive
          - `tag` 'b' | 'i' | 'a', required: Formatting tag
          - `url` string: Hyperlink URL (only when tag is 'a')
        - `page_number` integer: Page number from the source document
        - `para` integer: Paragraph group ID — sentences from the same element share a para
        - `part_index` integer: 0-based proactive-split part this chunk came from (HIL-326); nil when the source PDF wasn't split
        - `table_data` TableData
          - `column_count` integer, required: Number of columns in the table
          - `headers` string[], nullable: Column headers (first row if detected as a header row)
          - `rows` array[], required: 2D array of cell values (excluding header row when headers are present)
            - string[], nullable
          - `source_chunk_indices` integer[], nullable: Original chunk indices (for tables detected by pattern matching)
        - `text` string, required: The chunk text content
        - `transcription_confidence` number, double: Self-consistency agreement (0..1) for machine-transcribed chunks; higher = independent transcriptions agree
      - `section_id` string, required: Section identifier (e.g. 'a_1_1', 'transmittal_letter')
      - `section_title` string, required: Section title or header text
      - `source_filename` string: Source file or split-part name this section came from (multi-source vendor docs)
    - `source_filename` string: Original filename of the primary source document (e.g. 'sow.pdf')
  - `updated_at` string, date-time
  - `upload_timestamp` string, date-time
  - `uploaded_files_urls` string[], nullable
  - `workspace_id` integer, required

## Other responses

- `default`: Error

---

[API](https://skmtc.dev/hillstar/apis/rfpai-api-go.md) - [All operations](https://skmtc.dev/hillstar/apis/rfpai-api-go/llms.txt) - [OpenAPI document](https://skmtc.dev/hillstar/apis/rfpai-api-go/revisions/b2532dc47fc6?raw)
