---
title: "Read a single project (authoritative)"
method: GET
path: "/projects/v1/{project_id}"
tags: ["Projects"]
---

# Read a single project (authoritative)

`GET /projects/v1/{project_id}`

## Request

- Base URL: `https://api.run402.com`
- URL: `https://api.run402.com/projects/v1/{project_id}`
- Auth: one of:
  - HTTP bearer
  - API key in header `SIGN-IN-WITH-X`

Returns the authoritative server-side view of one project: identity, owning org, tier, lifecycle, public addressing (site_url + custom domains), last deploy, mailbox address(es), and usage versus tier limits. Authorized via the project.read action - a control-plane principal (SIWx wallet or session) with at least viewer access to the owning org, or platform admin. Authorize-before-reveal: a non-authorized caller (including a guessed id) gets the same 403, never a 404 that confirms existence. No secret or key value is ever returned.

## Path parameters

- `project_id` string, required: Run402 project ID. Public IDs are not UUIDs.

## Response `200`

The authoritative project view.

- object
  - `project_id` string: Run402 project ID. Public IDs are not UUIDs.
  - `public_id` string
  - `name` string, nullable
  - `org_id` string
  - `tier` string
  - `effective_status` string
  - `organization_lifecycle_state` string
  - `site_url` string, nullable
  - `custom_domains` string[]
  - `last_deploy` object, nullable
    - `release_id` string
    - `activated_at` string, date-time
  - `mailbox` string[]
  - `usage` object
    - `api_calls` integer
    - `storage_bytes` integer
    - `api_calls_limit` integer
    - `storage_bytes_limit` integer: Pooled app-storage cap in bytes (a round decimal tier constant).
    - `storage_limit` string: storage_bytes_limit as a human string, derived from the tier constant.
  - `created_at` string, date-time
  - `created_by` string, nullable: Legacy creating-principal field retained unchanged.
  - `creator` OperationActorSnapshot
    - `schema_version` 1, required
    - `principal` PrincipalSnapshot, required
      - `principal_id` string, required
      - `principal_type` string, required
      - `display_name_at_capture` string, nullable, required
      - `linked_identities_at_capture` LinkedIdentitySnapshot[], required
        - `identity_link_id` string, required
        - `kind` string, required
        - `public_subject` string, required
        - `display_subject` string, required
        - `verified_at` string, date-time, required
        - `status_at_capture` 'active', required
    - `authenticator` AuthenticatorSnapshot, required
      - `authenticator_id` string, required
      - `kind` string, required
      - `public_subject` string, required
    - `authority` AuthoritySnapshot, required: Discriminated immutable action-time authority: organization_membership, project_grant, grant_key, ci, system, legacy, or a preserved future kind. A link is never an authority kind.
      - `kind` string, required
      - `org_id` string, nullable
      - `project_id` string, nullable
      - `membership_id` string, nullable
      - `grant_id` string, nullable
      - `grant_key_id` string, nullable
      - `credential_id` string, nullable
      - `role` string, nullable
      - `scope` string[]
      - `reason_code` string, nullable
    - `captured_at` string, date-time, required

## Other responses

- `403`: Not authorized for this project (authorize-before-reveal).

---

[API](https://skmtc.dev/run402/apis/run402-api.md) · [All operations](https://skmtc.dev/run402/apis/run402-api/llms.txt) · [OpenAPI document](https://skmtc.dev/run402/apis/run402-api/revisions/893607557f50?raw)
