> ## 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, local product MCP or supported remote OAuth MCP. Read the current project source binding before choosing GitHub or managed versions. Mintlify search only reads documentation. Preserve the customer’s selected project, environment and authentication provider; keep private application values in the portal or local stdin flow.

# Create a table in the project's database

> Creates one ordinary table in the public schema of one environment's database, with the columns and the primary key the request names. Repeating an identical request answers the existing table with 200; a table of the same name with another definition is refused with database_table_conflict (409). The request wakes a sleeping database. A reached Stop budget refuses with project_budget_exceeded (402). At most 100 tables exist per database.



## OpenAPI

````yaml /openapi.json post /v1/projects/{project_id}/database/tables
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/tables:
    post:
      summary: Create a table in the project's database
      description: >-
        Creates one ordinary table in the public schema of one environment's
        database, with the columns and the primary key the request names.
        Repeating an identical request answers the existing table with 200; a
        table of the same name with another definition is refused with
        database_table_conflict (409). The request wakes a sleeping database. A
        reached Stop budget refuses with project_budget_exceeded (402). At most
        100 tables exist per database.
      operationId: createProjectDatabaseTable
      parameters:
        - $ref: '#/components/parameters/RequestId'
        - $ref: '#/components/parameters/ProjectId'
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DatabaseTableCreateRequest'
      responses:
        '200':
          description: >-
            The table already exists with the same columns, types, nullability,
            identity, defaults and primary key.
          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/DatabaseTableCreated'
        '201':
          description: The table this request created.
          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/DatabaseTableCreated'
        '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'
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      description: Identifies one mutation and its canonical request payload.
      required: true
      schema:
        type: string
        minLength: 1
        maxLength: 128
  schemas:
    DatabaseTableCreateRequest:
      type: object
      additionalProperties: false
      required:
        - environment
        - table
        - columns
      properties:
        environment:
          type: string
          enum:
            - dev
            - prod
        table:
          type: string
          pattern: ^[a-z_][a-z0-9_]{0,62}$
          description: >-
            Name of the new table in the public schema. Lower-case, not a
            PostgreSQL reserved word and not starting with pg_.
        columns:
          type: array
          minItems: 1
          maxItems: 64
          description: >-
            Columns in the order written. Names are unique, and at most one
            column is an identity column.
          items:
            $ref: '#/components/schemas/DatabaseTableColumnRequest'
        primary_key:
          type: array
          minItems: 1
          maxItems: 8
          uniqueItems: true
          description: >-
            Columns of the primary key, each one of the table's columns.
            Identity and primary key columns are NOT NULL; omitted when the
            table has no primary key.
          items:
            type: string
            pattern: ^[a-z_][a-z0-9_]{0,62}$
      examples:
        - environment: dev
          table: orders
          columns:
            - name: id
              type: bigint
              nullable: false
              identity: true
            - name: total
              type: numeric
          primary_key:
            - id
    DatabaseTableCreated:
      type: object
      additionalProperties: false
      required:
        - table
      properties:
        table:
          $ref: '#/components/schemas/DatabaseTable'
    Ulid:
      type: string
      pattern: ^[0-9A-HJKMNP-TV-Z]{26}$
    DatabaseTableColumnRequest:
      type: object
      additionalProperties: false
      required:
        - name
        - type
      properties:
        name:
          type: string
          pattern: ^[a-z_][a-z0-9_]{0,62}$
        type:
          $ref: '#/components/schemas/DatabaseTableColumnType'
        nullable:
          type: boolean
          default: true
          description: >-
            Whether the column accepts NULL. Identity and primary key columns
            never do.
        identity:
          type: boolean
          default: false
          description: >-
            Generated always as identity. Only integer and bigint columns can be
            identity columns, and an identity column has no default.
        default:
          type: string
          enum:
            - now
            - uuid
          description: >-
            now is now() on a timestamptz column; uuid is gen_random_uuid() on a
            uuid column. Omitted when the column has no default.
    DatabaseTable:
      type: object
      additionalProperties: false
      required:
        - environment
        - schema
        - table
        - columns
        - primary_key
        - created
      properties:
        environment:
          type: string
          enum:
            - dev
            - prod
        schema:
          type: string
          const: public
        table:
          type: string
        columns:
          type: array
          minItems: 1
          maxItems: 64
          items:
            $ref: '#/components/schemas/DatabaseTableColumn'
        primary_key:
          type: array
          maxItems: 8
          uniqueItems: true
          items:
            type: string
        created:
          type: boolean
          description: >-
            true when this request created the table, false when an identical
            table already existed.
    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
            - organization_required
            - 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
            - mail_capacity_unavailable
            - storage_jurisdiction_conflict
            - shared_data_requires_promotion
            - production_deployment_required
            - framework_conversion_required
            - repository_configuration_missing
            - migration_filename_noncanonical
            - environment_secret_mutation_blocked
            - workers_runtime_incompatible
            - project_handle_invalid
            - project_handle_taken
            - project_handle_unchanged
            - project_rename_blocked
            - payload_too_large
            - rate_limited
            - insufficient_organization_credits
            - paid_plan_required
            - project_budget_exceeded
            - compute_performance_paid_required
            - compute_paid_required
            - compute_storage_shrink_requires_migration
            - compute_performance_unavailable
            - database_write_pending
            - database_access_limit
            - database_webhook_limit
            - database_schedule_limit
            - database_schedule_not_runnable
            - database_webhook_delivery_pending
            - database_watch_limit
            - database_watch_table_unavailable
            - database_watch_column_unavailable
            - database_watch_events_unavailable
            - database_watch_conflict
            - database_table_conflict
            - database_table_limit
            - compute_change_pending
            - compute_change_conflict
            - billing_purchase_conflict
            - billing_recharge_conflict
            - github_connection_required
            - github_connection_revoked
            - repository_not_installed
            - cloudflare_zone_not_bound
            - cloudflare_authorization_closed
            - project_notes_conflict
            - project_export_not_ready
            - powered_by_flag_required
            - interactive_login_required
            - api_key_creation_uncertain
            - api_key_permissions_unavailable
            - reconciliation_exhausted
            - service_unavailable
            - source_commit_not_found
            - domain_hostname_taken
            - domain_dns_conflict
            - data_change_blocked
            - data_change_in_progress
            - data_change_not_applicable
            - rollback_target_data_changed
            - project_domain_delete_required
        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
    DatabaseTableColumnType:
      type: string
      enum:
        - text
        - integer
        - bigint
        - boolean
        - numeric
        - double precision
        - timestamptz
        - date
        - uuid
        - jsonb
    DatabaseTableColumn:
      type: object
      additionalProperties: false
      required:
        - name
        - type
        - nullable
        - identity
        - default
      properties:
        name:
          type: string
        type:
          $ref: '#/components/schemas/DatabaseTableColumnType'
        nullable:
          type: boolean
        identity:
          type: boolean
        default:
          type:
            - string
            - 'null'
          enum:
            - now
            - uuid
            - null
  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.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.