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

# Approve a pending request

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

Records the caller's approval. On full quorum the version goes live and the offer auto-releases for signing. Only a named approver may decide.



## OpenAPI

````yaml assets/openapi-v2-offers.json post /api/offers/{id}/approval/approve
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}/approval/approve:
    post:
      tags:
        - Offer approval
      summary: Approve a pending request
      description: >-
        **Beta. This endpoint is unstable and may still change without notice.**
        Pin against the dated version and watch the changelog.


        Records the caller's approval. On full quorum the version goes live and
        the offer auto-releases for signing. Only a named approver may decide.
      operationId: approveOffer
      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/ApproveOfferInput'
      responses:
        '200':
          description: The updated approval sub-resource.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OfferApprovalView'
        '403':
          description: Not a named approver, access denied or feature not available.
        '404':
          description: Offer not found, other organisation, or no pending request.
        '409':
          description: The request is no longer pending.
      security:
        - ApiToken: []
components:
  schemas:
    ApproveOfferInput:
      type: object
      properties:
        comment:
          type:
            - string
            - 'null'
          description: Optional approver comment.
    OfferApprovalView:
      type: object
      description: >-
        Internal approval state of an offer. Returned only to authenticated
        staff, never to the recipient.
      properties:
        versionApprovalStatus:
          type: string
          enum:
            - not_required
            - pending
            - approved
            - rejected
            - superseded
        requiresApproval:
          type: boolean
          description: Whether an approval workflow applies.
        request:
          allOf:
            - $ref: '#/components/schemas/ApprovalRequestView'
          description: The running approval request. Null when none is pending.
        canCurrentUserDecide:
          type: boolean
          description: Whether the caller is a named approver who may decide now.
      required:
        - versionApprovalStatus
        - requiresApproval
        - canCurrentUserDecide
    ApprovalRequestView:
      type: object
      properties:
        id:
          type: string
        status:
          type: string
          enum:
            - pending
            - approved
            - rejected
            - superseded
        requestedBy:
          $ref: '#/components/schemas/ApprovalRequesterView'
        requestedAt:
          type: string
          format: date-time
        step:
          $ref: '#/components/schemas/ApprovalStepView'
        decisions:
          type: array
          items:
            $ref: '#/components/schemas/ApprovalDecisionView'
      required:
        - id
        - status
        - step
        - decisions
    ApprovalRequesterView:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
      required:
        - id
        - name
    ApprovalStepView:
      type: object
      properties:
        order:
          type: integer
        name:
          type: string
        requirement:
          type: string
          enum:
            - any
            - all
          description: Whether any one or all named approvers must approve.
        approvers:
          type: array
          items:
            $ref: '#/components/schemas/ApprovalApproverView'
      required:
        - order
        - requirement
        - approvers
    ApprovalDecisionView:
      type: object
      properties:
        account:
          type: string
        decision:
          type: string
          enum:
            - approve
            - reject
        comment:
          type:
            - string
            - 'null'
        decidedAt:
          type: string
          format: date-time
      required:
        - account
        - decision
        - decidedAt
    ApprovalApproverView:
      type: object
      properties:
        type:
          type: string
          enum:
            - role
            - user
        id:
          type: string
        label:
          type: string
      required:
        - type
        - id
        - label
  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.

````