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

# Create or resume an owner's hosted Stripe Checkout

> Returns a human payment URL, never charges a saved card. Paid is USD 10/month; each top-up pack is USD 10 before tax; a purchase grants 100 credits per dollar up to USD 100 and 125 credits per dollar for the part above, so 10 packs grant 10000 and 20 packs grant 22500 credits. Top-ups require active Paid access and have no time limit during uninterrupted Paid membership; remaining top-ups expire when the workspace returns to Free. Monthly Paid credits expire at billing-period end without rollover. Retry the same offer, packs and Idempotency-Key after uncertainty. Browser return is not payment proof; read this checkout and the organization balance. A conflicting or existing subscription returns billing_purchase_conflict (409); read the original checkout or request an owner billing portal URL instead of another purchase. Works at zero credits.



## OpenAPI

````yaml /openapi.json post /v1/organizations/{organization_id}/billing/checkouts
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/organizations/{organization_id}/billing/checkouts:
    post:
      summary: Create or resume an owner's hosted Stripe Checkout
      description: >-
        Returns a human payment URL, never charges a saved card. Paid is USD
        10/month; each top-up pack is USD 10 before tax; a purchase grants 100
        credits per dollar up to USD 100 and 125 credits per dollar for the part
        above, so 10 packs grant 10000 and 20 packs grant 22500 credits. Top-ups
        require active Paid access and have no time limit during uninterrupted
        Paid membership; remaining top-ups expire when the workspace returns to
        Free. Monthly Paid credits expire at billing-period end without
        rollover. Retry the same offer, packs and Idempotency-Key after
        uncertainty. Browser return is not payment proof; read this checkout and
        the organization balance. A conflicting or existing subscription returns
        billing_purchase_conflict (409); read the original checkout or request
        an owner billing portal URL instead of another purchase. Works at zero
        credits.
      operationId: createBillingCheckout
      parameters:
        - $ref: '#/components/parameters/RequestId'
        - $ref: '#/components/parameters/IdempotencyKey'
        - name: organization_id
          in: path
          required: true
          schema:
            $ref: '#/components/schemas/Ulid'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
                - offer
                - packs
              properties:
                offer:
                  type: string
                  enum:
                    - topup
                    - paid
                packs:
                  type: integer
                  minimum: 1
                  maximum: 100
                  description: Paid requires exactly one pack.
      responses:
        '201':
          description: Original checkout and its current provider-observed status.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BillingCheckout'
        '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'
        '413':
          $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
    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:
    Ulid:
      type: string
      pattern: ^[0-9A-HJKMNP-TV-Z]{26}$
    BillingCheckout:
      type: object
      additionalProperties: false
      required:
        - organization_id
        - checkout_id
        - offer
        - state
        - payment_confirmed
        - url
        - expires_at
        - packs
        - credited_micros
        - revoked_micros
        - paid_until
        - required_action
        - billing_issue
      properties:
        organization_id:
          $ref: '#/components/schemas/Ulid'
        checkout_id:
          $ref: '#/components/schemas/Ulid'
        offer:
          type: string
          enum:
            - topup
            - paid
        state:
          type: string
          enum:
            - open
            - complete
            - expired
        payment_confirmed:
          type: boolean
        url:
          type:
            - string
            - 'null'
          format: uri
          maxLength: 8192
        expires_at:
          type: string
          format: date-time
        packs:
          type: integer
          minimum: 1
          maximum: 100
        credited_micros:
          type: string
          pattern: ^(0|[1-9][0-9]{0,18})$
        revoked_micros:
          type: string
          pattern: ^(0|[1-9][0-9]{0,18})$
        paid_until:
          type:
            - string
            - 'null'
          format: date-time
        required_action:
          type: string
          enum:
            - none
            - complete_checkout
            - open_billing_portal
            - contact_support
          description: >-
            Human payment handoff. Complete the returned Checkout URL, request a
            fresh billing portal URL to correct billing details, or contact
            ohmyho.st when tax configuration requires review. none includes a
            draft invoice awaiting automatic processing; it is not a claim of
            current Paid coverage. Never infer renewal success from the
            historical payment_confirmed flag.
        billing_issue:
          $ref: '#/components/schemas/BillingTaxIssue'
    BillingTaxIssue:
      description: Verified issue on an existing Stripe invoice; no new purchase is needed.
      type:
        - object
        - 'null'
      additionalProperties: false
      required:
        - code
        - invoice_id
        - observed_at
        - required_action
      properties:
        code:
          type: string
          enum:
            - billing_tax_location_required
            - billing_tax_calculation_failed
            - billing_tax_configuration_required
        invoice_id:
          type: string
          pattern: ^in_[A-Za-z0-9_]{1,253}$
        observed_at:
          type: string
          format: date-time
        required_action:
          type: string
          enum:
            - open_billing_portal
            - contact_support
    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_performance_unavailable
            - database_write_pending
            - database_access_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
  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.
  headers:
    XRequestId:
      description: Correlates the request with operations, events, logs, and audit records.
      required: true
      schema:
        type: string
        minLength: 1
        maxLength: 128
  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.