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

> ## Agent Instructions
> For account actions, read https://ohmyho.st/skills/ohmyhost-get-started/SKILL.md and use the authenticated ohmyho.st CLI or local product MCP. Mintlify search only reads documentation. Preserve the customer’s selected project, environment and authentication provider.

# Issue one time-bound PostgreSQL credential for Dev or Prod

> Owner-authorized direct PostgreSQL login for the project's own database, returned exactly once and never retrievable again. Mode read joins the read-only role, mode write joins the same restricted runtime role the application uses; neither can change schema, and application row-level security policies remain effective. The lifetime is 5 minutes to 24 hours (3600 seconds by default) and PostgreSQL refuses new logins after it; the platform ends remaining sessions within 15 minutes after expiry, at the latest. At most three active credentials exist per project environment. Database compute wakes and is metered normally, and existing credit grace and Stop budgets apply. Revoke the credential as soon as the work is finished and never store the connection URI in files, notes or source.



## OpenAPI

````yaml /openapi.json post /v1/projects/{project_id}/database/access
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/{project_id}/database/access:
    post:
      summary: Issue one time-bound PostgreSQL credential for Dev or Prod
      description: >-
        Owner-authorized direct PostgreSQL login for the project's own database,
        returned exactly once and never retrievable again. Mode read joins the
        read-only role, mode write joins the same restricted runtime role the
        application uses; neither can change schema, and application row-level
        security policies remain effective. The lifetime is 5 minutes to 24
        hours (3600 seconds by default) and PostgreSQL refuses new logins after
        it; the platform ends remaining sessions within 15 minutes after expiry,
        at the latest. At most three active credentials exist per project
        environment. Database compute wakes and is metered normally, and
        existing credit grace and Stop budgets apply. Revoke the credential as
        soon as the work is finished and never store the connection URI in
        files, notes or source.
      operationId: createProjectDatabaseAccess
      parameters:
        - $ref: '#/components/parameters/RequestId'
        - $ref: '#/components/parameters/ProjectId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProjectDatabaseAccessRequest'
      responses:
        '201':
          description: >-
            The connection URI is returned once and is never persisted in
            plaintext.
          headers:
            Cache-Control:
              schema:
                type: string
                const: no-store
            Pragma:
              schema:
                type: string
                const: no-cache
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectDatabaseAccessCredential'
        '400':
          $ref: '#/components/responses/Problem'
        '401':
          $ref: '#/components/responses/Problem'
        '402':
          $ref: '#/components/responses/Problem'
        '404':
          $ref: '#/components/responses/ResourceNotFound'
        '409':
          $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
    ProjectId:
      name: project_id
      in: path
      description: Project identifier.
      required: true
      schema:
        $ref: '#/components/schemas/Ulid'
  schemas:
    ProjectDatabaseAccessRequest:
      type: object
      additionalProperties: false
      required:
        - environment
      properties:
        environment:
          type: string
          enum:
            - dev
            - prod
        mode:
          type: string
          enum:
            - read
            - write
          default: read
          description: >-
            read joins the read-only role; write joins the restricted runtime
            role. Neither can change schema.
        ttl_seconds:
          type: integer
          minimum: 300
          maximum: 86400
          default: 3600
          description: Credential lifetime between 5 minutes and 24 hours.
        label:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 64
          description: >-
            Optional customer label without control characters or surrounding
            whitespace.
    ProjectDatabaseAccessCredential:
      allOf:
        - $ref: '#/components/schemas/ProjectDatabaseAccess'
        - type: object
          additionalProperties: false
          required:
            - connection_uri
            - psql_command
          properties:
            connection_uri:
              type: string
              format: uri
              description: >-
                Returned exactly once. Use it immediately and never store it in
                files, notes or source.
            psql_command:
              type: string
              description: The same credential as a ready psql invocation.
    Ulid:
      type: string
      pattern: ^[0-9A-HJKMNP-TV-Z]{26}$
    ProjectDatabaseAccess:
      type: object
      additionalProperties: false
      required:
        - access_id
        - environment
        - mode
        - role_name
        - host
        - database
        - label
        - state
        - issued_at
        - expires_at
        - revoked_at
        - revocation_reason
      properties:
        access_id:
          $ref: '#/components/schemas/Ulid'
        environment:
          type: string
          enum:
            - dev
            - prod
        mode:
          type: string
          enum:
            - read
            - write
        role_name:
          type: string
          pattern: ^ohmyho_da_[0-7][0-9a-hjkmnp-tv-z]{25}_[0-9a-z]{8}$
        host:
          type: string
          minLength: 1
          maxLength: 253
        database:
          type: string
          const: neondb
        label:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 64
        state:
          type: string
          enum:
            - active
            - expired
            - revoked
        issued_at:
          type: string
          format: date-time
        expires_at:
          type: string
          format: date-time
        revoked_at:
          type:
            - string
            - 'null'
          format: date-time
        revocation_reason:
          type:
            - string
            - 'null'
          enum:
            - principal
            - expired
            - budget
            - creation_failed
            - null
    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
            - database_write_pending
            - database_access_limit
            - compute_change_pending
            - compute_change_conflict
            - billing_purchase_conflict
            - billing_recharge_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
  headers:
    XRequestId:
      description: Correlates the request with operations, events, logs, and audit records.
      required: true
      schema:
        type: string
        minLength: 1
        maxLength: 128
  responses:
    Problem:
      description: The request failed.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
    ResourceNotFound:
      description: >-
        The resource does not exist or is not visible to the authenticated
        principal.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          examples:
            resourceNotFound:
              value:
                type: https://docs.ohmyho.st/errors/resource-not-found
                title: Resource not found
                status: 404
                code: resource_not_found
                request_id: req_01J00000000000000000000000
                retryable: false
                suggested_action: Check the resource identifier and your access scope.
  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.

````