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

# Get an offer

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

Returns the canonical v2 offer resource: structured contract value, grouped documents, recipients and links. The approval state is never embedded; fetch it via GET /api/offers/{id}/approval. This replaces the deprecated GET /offers/{id}.



## OpenAPI

````yaml assets/openapi-v2-offers.json get /api/offers/{id}
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}:
    get:
      tags:
        - Offers
      summary: Get an offer
      description: >-
        **Beta. This endpoint is unstable and may still change without notice.**
        Pin against the dated version and watch the changelog.


        Returns the canonical v2 offer resource: structured contract value,
        grouped documents, recipients and links. The approval state is never
        embedded; fetch it via GET /api/offers/{id}/approval. This replaces the
        deprecated GET /offers/{id}.
      operationId: getOffer
      parameters:
        - name: id
          in: path
          required: true
          description: Offer ID (ULID).
          schema:
            type: string
            format: ulid
      responses:
        '200':
          description: The offer resource.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OfferResource'
        '403':
          description: Access denied.
        '404':
          description: Offer not found or in another organisation.
      security:
        - ApiToken: []
components:
  schemas:
    OfferResource:
      type: object
      description: The canonical v2 representation of an offer.
      properties:
        id:
          type: string
          description: Stable offer identifier (ULID).
        number:
          type: string
          description: Human-readable offer number, e.g. ANG-1042.
        name:
          type:
            - string
            - 'null'
          description: Optional internal title.
        status:
          type: string
          enum:
            - open
            - signing
            - awaiting_invoice_details
            - signed
            - archived
        acceptanceMode:
          type: string
          enum:
            - click
            - esignature
            - print
        dealType:
          type: string
          enum:
            - new_business
            - expansion
            - renewal
            - one_off
        locale:
          type:
            - string
            - 'null'
          example: de
        validUntil:
          type:
            - string
            - 'null'
          format: date-time
        createdAt:
          type:
            - string
            - 'null'
          format: date-time
        updatedAt:
          type:
            - string
            - 'null'
          format: date-time
        issuedAt:
          type:
            - string
            - 'null'
          format: date-time
          description: When the offer was first published.
        signedAt:
          type:
            - string
            - 'null'
          format: date-time
        contractValue:
          allOf:
            - $ref: '#/components/schemas/OfferMoneyView'
          description: Total contract value. Null if not computable yet.
        recipients:
          type: array
          items:
            $ref: '#/components/schemas/OfferRecipientResource'
        documents:
          $ref: '#/components/schemas/OfferDocumentsView'
        proposal:
          allOf:
            - $ref: '#/components/schemas/ProposalViewModel'
          description: >-
            Computed pricing model. Null if the offer carries no priced
            proposal.
        sections:
          type: array
          items:
            type: object
            additionalProperties: true
          description: Document blocks that make up the offer body.
        autoActivateSubscription:
          type: boolean
        customVariables:
          type: object
          additionalProperties:
            type: string
          description: Custom template variables as name to value.
        links:
          $ref: '#/components/schemas/OfferLinksView'
        customer:
          allOf:
            - $ref: '#/components/schemas/CustomerRef'
          description: Linked customer. Null if the offer is not linked yet.
        subscription:
          allOf:
            - $ref: '#/components/schemas/SubscriptionRef'
          description: >-
            Linked subscription. Set when the offer extends or renews an
            existing subscription, and also once an accepted offer has been
            converted into a subscription. Null when the offer is not linked to
            a subscription.
        contactPerson:
          allOf:
            - $ref: '#/components/schemas/ContactPersonRef'
          description: Primary contact person. Null if none is set.
        salesChannel:
          allOf:
            - $ref: '#/components/schemas/SalesChannelReference'
          description: Sales channel the offer belongs to.
      required:
        - id
        - number
        - status
        - acceptanceMode
        - dealType
        - recipients
        - documents
    OfferMoneyView:
      type: object
      description: Monetary amount in minor units.
      properties:
        amount:
          type: integer
          description: Value in minor units, e.g. cents.
        currencyCode:
          type: string
          example: EUR
        precision:
          type: integer
          description: Number of minor-unit decimals.
      required:
        - amount
        - currencyCode
        - precision
    OfferRecipientResource:
      type: object
      description: A person the offer is shared with.
      properties:
        id:
          type: string
        email:
          type: string
          format: email
        firstName:
          type:
            - string
            - 'null'
        lastName:
          type:
            - string
            - 'null'
        role:
          type: string
          enum:
            - read
            - sign
            - countersigner
      required:
        - email
        - role
    OfferDocumentsView:
      type: object
      description: Grouped offer documents. Each slot is null until the document exists.
      properties:
        signed:
          allOf:
            - $ref: '#/components/schemas/MediaRef'
          description: Signed PDF. Null until the offer is signed.
        auditLog:
          allOf:
            - $ref: '#/components/schemas/MediaRef'
          description: Acceptance / audit-trail document. Null until acceptance.
        purchaseOrder:
          allOf:
            - $ref: '#/components/schemas/MediaRef'
          description: Uploaded purchase order. Null if none was uploaded.
    ProposalViewModel:
      type: object
      description: >-
        Computed pricing model (line items and totals) as shown to the
        recipient.
      additionalProperties: true
    OfferLinksView:
      type: object
      description: Related sub-resources (HATEOAS).
      properties:
        self:
          type: string
          description: Canonical link to this offer.
        approval:
          type: string
          description: Link to the approval sub-resource (GET /api/offers/{id}/approval).
    CustomerRef:
      type: object
      properties:
        id:
          type: string
        name:
          type:
            - string
            - 'null'
      required:
        - id
    SubscriptionRef:
      type: object
      properties:
        id:
          type: string
        number:
          type:
            - string
            - 'null'
      required:
        - id
    ContactPersonRef:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
      required:
        - id
        - name
    SalesChannelReference:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        brandName:
          type: string
      required:
        - id
        - name
    MediaRef:
      type: object
      description: Reference to an offer-related document.
      properties:
        id:
          type: string
          description: >-
            Media ID. The binary is not inlined. To download it, either call
            `GET /media/{id}/download` with your API token, or mint a shareable
            link with `POST /media/{id}/download-token` and then `GET
            /media/{id}/download/{token}` (no authentication needed for the
            token holder).
        url:
          type:
            - string
            - 'null'
          description: >-
            Pre-resolved download URL. Currently always null; resolve the file
            via the media download endpoints described under `id`.
        filename:
          type: string
      required:
        - id
        - filename
  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.

````