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

# Publish an offer

> **Beta. This endpoint is unstable and may still change without notice.** Pin against the dated version and watch the changelog.

Freezes the current draft as a version and either publishes it directly or, when an approval workflow matches, opens an approval request. The outcome tells you which happened. Optionally notifies recipients.



## OpenAPI

````yaml assets/openapi-v2-offers.json post /api/offers/{id}/publish
openapi: 3.1.0
info:
  title: Fynn Angebote API (Beta)
  version: 2026-06
  description: >-
    **Beta / Unstable.** The Fynn Angebote (offers) API lets you read, update,
    publish, approve and accept offers programmatically. It is the actively
    maintained surface that replaces the older offer endpoints (still available
    but deprecated, removed on 2026-08-01).


    These endpoints are new and may still change without notice while the
    surface settles. Pin against the dated version and watch the changelog
    before relying on them in production.


    Authenticate every request with an API token of your organisation
    (`Authorization: Bearer api_...`). Documents are returned as media
    references; see the note on each media `id` for how to download the file.
servers:
  - url: https://coreapi.io
    description: Production
  - url: https://preview.coreapi.io
    description: Sandbox
security:
  - ApiToken: []
tags:
  - name: Offers
    description: Read, update, publish and accept offers. Beta.
  - name: Offer approval
    description: Internal approval flow for offers. Beta.
paths:
  /api/offers/{id}/publish:
    post:
      tags:
        - Offers
      summary: Publish an offer
      description: >-
        **Beta. This endpoint is unstable and may still change without notice.**
        Pin against the dated version and watch the changelog.


        Freezes the current draft as a version and either publishes it directly
        or, when an approval workflow matches, opens an approval request. The
        outcome tells you which happened. Optionally notifies recipients.
      operationId: publishOffer
      parameters:
        - name: id
          in: path
          required: true
          description: Offer ID (ULID).
          schema:
            type: string
            format: ulid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PublishOfferInput'
      responses:
        '200':
          description: The publish outcome.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublishOutcomeView'
        '403':
          description: Access denied or feature not available.
        '404':
          description: Offer not found or in another organisation.
      security:
        - ApiToken: []
components:
  schemas:
    PublishOfferInput:
      type: object
      properties:
        recipientIds:
          type: array
          items:
            type: string
          description: IDs of existing recipients to notify.
        notifyRecipients:
          type: boolean
          default: false
          description: Whether to send the invitation emails.
        customMessage:
          type:
            - string
            - 'null'
          description: Optional message for the invitation email.
        newRecipients:
          type: array
          items:
            $ref: '#/components/schemas/PublishOfferNewRecipientInput'
          description: Recipients to create and notify in one step.
    PublishOutcomeView:
      type: object
      properties:
        outcome:
          type: string
          enum:
            - PUBLISHED
            - PENDING_APPROVAL
          description: >-
            PUBLISHED when the offer went live, PENDING_APPROVAL when an
            approval workflow opened a request.
        requestId:
          type:
            - string
            - 'null'
          description: Approval request ID when outcome is PENDING_APPROVAL.
      required:
        - outcome
    PublishOfferNewRecipientInput:
      type: object
      properties:
        email:
          type: string
          format: email
        firstName:
          type:
            - string
            - 'null'
          maxLength: 100
        lastName:
          type:
            - string
            - 'null'
          maxLength: 100
      required:
        - email
  securitySchemes:
    ApiToken:
      type: http
      scheme: bearer
      description: >-
        API token of the organisation. Send it as Authorization: Bearer api_...
        The token is bound to exactly one organisation.

````