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

# Publish a private module version

> The owning organization publishes its module from an admin session. The manifest must fit the platform manifest contract. Native event types belong to the module, while canonical event types belong to the platform; a manifest that does not fit the publish-time contract is rejected and remains a draft. An `org_` key cannot publish a module.



## OpenAPI

````yaml https://api.develop.fourdos.dev/openapi/partner.json post /v1/modules/{moduleId}/versions/{versionId}/publish
openapi: 3.1.0
info:
  title: 4D OS Partner API
  version: 0.1.0
  description: >-
    REST API for 4D OS partners. Authenticate with your organization API key:
    `Authorization: Bearer <key>`.


    Requests and responses are JSON with `snake_case` field names. Errors share
    one envelope: `{ "error": { "code", "status", "message", "details"? } }`.


    Mutating endpoints that declare it accept an `Idempotency-Key` header so
    retries are safe.


    Bulk-migrating members? See the [Migrating to 4D
    guide](https://docs.fourdos.dev/walkthroughs/migrate-existing-members) for
    the canonical import schema, a worked example, and the `/v1/imports`
    sequence.
servers:
  - url: https://api.develop.fourdos.dev
security:
  - partnerApiKey: []
tags:
  - name: Users
    description: Create, read, and manage users and their org membership
  - name: Imports
    description: Bulk member import jobs (staging → validate → commit)
  - name: API keys
    description: Issue, list, and revoke server-side organization API keys
  - name: Modules
    description: >-
      Publish private modules, install visible modules, and manage their
      credentials
  - name: Ingest
    description: Receive signed native events from an installed module
  - name: Engagement
    description: Browser event tracking (publishable keys) and tracking-key management
paths:
  /v1/modules/{moduleId}/versions/{versionId}/publish:
    post:
      tags:
        - Modules
      summary: Publish a private module version
      description: >-
        The owning organization publishes its module from an admin session. The
        manifest must fit the platform manifest contract. Native event types
        belong to the module, while canonical event types belong to the
        platform; a manifest that does not fit the publish-time contract is
        rejected and remains a draft. An `org_` key cannot publish a module.
      operationId: publishModuleVersion
      parameters:
        - name: moduleId
          in: path
          required: true
          schema:
            type: string
        - name: versionId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Module version published
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublishedModuleVersionResponse'
        '401':
          description: Authentication is required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Only the owning organization can publish this private module
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Module or version not found or not visible to this organization
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: The module version is already published
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: The manifest does not fit the platform module contract
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - adminSession: []
components:
  schemas:
    PublishedModuleVersionResponse:
      type: object
      properties:
        module:
          $ref: '#/components/schemas/ModuleResponse'
        version:
          $ref: '#/components/schemas/ModuleVersionResponse'
      required:
        - module
        - version
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
            status:
              type: integer
            message:
              type: string
            details:
              type: object
              additionalProperties: true
          required:
            - code
            - status
            - message
      required:
        - error
    ModuleResponse:
      type: object
      properties:
        id:
          type: string
        slug:
          type: string
        name:
          type: string
        kind:
          type: string
          enum:
            - proprietary
            - in_house
            - third_party
        vendor:
          anyOf:
            - type: string
            - type: 'null'
        owner_organization_id:
          anyOf:
            - type: string
            - type: 'null'
        current_version_id:
          anyOf:
            - type: string
            - type: 'null'
        status:
          type: string
          enum:
            - draft
            - published
            - deprecated
        created_at:
          type: string
        updated_at:
          type: string
      required:
        - id
        - slug
        - name
        - kind
        - vendor
        - owner_organization_id
        - current_version_id
        - status
        - created_at
        - updated_at
    ModuleVersionResponse:
      type: object
      properties:
        id:
          type: string
        module_id:
          type: string
        version:
          type: string
        manifest:
          type: object
          propertyNames:
            type: string
          additionalProperties: {}
        status:
          type: string
          enum:
            - draft
            - published
            - retired
        published_at:
          anyOf:
            - type: string
            - type: 'null'
        created_at:
          type: string
        updated_at:
          type: string
      required:
        - id
        - module_id
        - version
        - manifest
        - status
        - published_at
        - created_at
        - updated_at
  securitySchemes:
    partnerApiKey:
      type: http
      scheme: bearer
      description: >-
        Organization API key (`org_...`) sent as `Authorization: Bearer <key>`.
        Keys are scoped to one organization; every request operates within that
        tenant.
    adminSession:
      type: http
      scheme: bearer
      description: >-
        Partner admin session token sent as `Authorization: Bearer <token>`.
        Obtained by signing in (console or the email OTP endpoints) and
        completing the second factor; see the Authentication page.

````