> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ohmyho.st/llms.txt
> Use this file to discover all available pages before exploring further.

# List projects visible to the current authenticated identity

> Returns a stable ULID-ordered page across only the caller's authorized organizations.



## OpenAPI

````yaml /openapi.json get /v1/projects
openapi: 3.1.2
info:
  title: ohmyho.st API
  version: 0.0.0
  description: >-
    Public REST API for ohmyho.st hosting, projects, domains, email, credits and
    exports.
servers:
  - url: https://app.ohmyho.st
    description: Production control API
  - url: https://dev.app.ohmyho.st
    description: Development control API
security:
  - BearerAuth: []
paths:
  /v1/projects:
    get:
      summary: List projects visible to the current authenticated identity
      description: >-
        Returns a stable ULID-ordered page across only the caller's authorized
        organizations.
      operationId: listProjects
      parameters:
        - $ref: '#/components/parameters/RequestId'
        - $ref: '#/components/parameters/ProjectCursor'
        - $ref: '#/components/parameters/ProjectLimit'
      responses:
        '200':
          description: A tenant-scoped project page.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectPage'
        '400':
          $ref: '#/components/responses/Problem'
        '401':
          $ref: '#/components/responses/Problem'
        '403':
          $ref: '#/components/responses/Problem'
        '429':
          $ref: '#/components/responses/Problem'
        '503':
          $ref: '#/components/responses/Problem'
components:
  parameters:
    RequestId:
      name: X-Request-Id
      in: header
      description: Optional caller-provided correlation identifier.
      required: false
      schema:
        type: string
        minLength: 1
        maxLength: 128
    ProjectCursor:
      name: cursor
      in: query
      description: Opaque continuation cursor returned by the preceding project page.
      required: false
      schema:
        $ref: '#/components/schemas/Ulid'
    ProjectLimit:
      name: limit
      in: query
      description: Maximum number of projects to return.
      required: false
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 50
  headers:
    XRequestId:
      description: Correlates the request with operations, events, logs, and audit records.
      required: true
      schema:
        type: string
        minLength: 1
        maxLength: 128
  schemas:
    ProjectPage:
      type: object
      additionalProperties: false
      required:
        - items
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/Project'
        next_cursor:
          type:
            - string
            - 'null'
          pattern: ^[0-9A-HJKMNP-TV-Z]{26}$
    Ulid:
      type: string
      pattern: ^[0-9A-HJKMNP-TV-Z]{26}$
    Project:
      type: object
      additionalProperties: false
      required:
        - id
        - organization_id
        - name
        - handle
        - data_mode
        - created_at
      properties:
        id:
          $ref: '#/components/schemas/Ulid'
        organization_id:
          $ref: '#/components/schemas/Ulid'
        name:
          type: string
          minLength: 1
          maxLength: 128
          pattern: ^\S(?:.*\S)?$
        handle:
          type: string
          minLength: 5
          maxLength: 59
          pattern: ^[a-z]+-[a-z]+-[a-z]+$
        data_mode:
          $ref: '#/components/schemas/ProjectDataMode'
        created_at:
          type: string
          format: date-time
    ProblemDetails:
      type: object
      description: RFC 9457 Problem Details extended with stable ohmyhost recovery fields.
      additionalProperties: false
      required:
        - type
        - title
        - status
        - code
        - request_id
        - retryable
        - suggested_action
      properties:
        type:
          type: string
          format: uri-reference
        title:
          type: string
          minLength: 1
        status:
          type: integer
          minimum: 400
          maximum: 599
        detail:
          type: string
        instance:
          type: string
          format: uri-reference
        code:
          type: string
          enum:
            - invalid_request
            - unauthenticated
            - forbidden
            - resource_not_found
            - idempotency_key_reused
            - project_handle_unavailable
            - project_identity_unavailable
            - deployment_plan_expired
            - deployment_plan_incompatible
            - confirmation_expired
            - confirmation_invalid
            - etag_mismatch
            - promotion_source_stale
            - promotion_target_stale
            - promotion_invalid_target
            - mail_domain_conflict
            - mail_domain_required
            - framework_conversion_required
            - migration_filename_noncanonical
            - environment_secret_mutation_blocked
            - container_runtime_required
            - payload_too_large
            - rate_limited
            - insufficient_organization_credits
            - paid_plan_required
            - project_budget_exceeded
            - compute_performance_paid_required
            - compute_performance_unavailable
            - compute_change_pending
            - compute_change_conflict
            - billing_purchase_conflict
            - cloudflare_authorization_closed
            - project_notes_conflict
            - project_export_not_ready
            - interactive_login_required
            - api_key_creation_uncertain
            - api_key_permissions_unavailable
            - reconciliation_exhausted
            - service_unavailable
        request_id:
          type: string
          minLength: 1
          maxLength: 128
        retryable:
          type: boolean
        retry_after_seconds:
          type: integer
          minimum: 1
          maximum: 86400
          description: >-
            Optional machine-readable retry delay for a rate limit, matching
            Retry-After.
        suggested_action:
          type: string
          minLength: 1
    ProjectDataMode:
      type: string
      enum:
        - shared
        - isolated
      default: shared
      description: >-
        Chosen when the project is created. shared uses one database and a
        shared file namespace across Dev/Prod; isolated keeps their
        database/Auth records and files separate. Skills recommend isolated
        development, but the customer chooses the additional measured database
        consumption. Promotion applies pending schema migrations to an isolated
        Prod database without copying Dev data. Changing an established mode
        requires an explicit data migration.
  responses:
    Problem:
      description: The request failed.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        WorkOS access JWT or a user-owned WorkOS API key. User keys are bound to
        one organization and restricted to their enabled product permissions.
        Session-only onboarding and session revocation require an interactive
        access JWT. No cookie session is assumed.

````