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

# Get an offer

> One offer of the workspace of the API key. An ID of another workspace is reported as not found.



## OpenAPI

````yaml /api-reference/openapi.json get /offers/{id}
openapi: 3.1.0
info:
  title: HocDoc API
  version: 1.0.0
  description: >-
    Read-only API for offers and their timeline.


    Send an API key as `Authorization: Bearer <key>`. A key belongs to one
    workspace and only reads its data. Create keys in the app under
    Einstellungen, Integrationen.


    Timestamps are ISO 8601 in UTC with milliseconds. Values outside the years
    0001 to 9999 are clamped to that range.


    Limits: 120 requests per minute per key and 300 requests per minute per IP
    address. See the `RateLimit-*` headers of each response.


    Compatibility: new fields, endpoints and event types may be added at any
    time, so ignore what you do not know. Breaking changes come under a new path
    (`/api/v2`).
servers:
  - url: https://app.hocdoc.com/api/v1
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Workspace
    description: The workspace of the API key.
  - name: Offers
    description: Offers and their timeline.
paths:
  /offers/{id}:
    get:
      tags:
        - Offers
      summary: Get an offer
      description: >-
        One offer of the workspace of the API key. An ID of another workspace is
        reported as not found.
      operationId: getOffer
      parameters:
        - name: id
          in: path
          required: true
          description: ID of the offer.
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: The offer.
          headers:
            RateLimit-Limit:
              description: Requests allowed per window for this API key.
              required: true
              schema:
                type: integer
            RateLimit-Remaining:
              description: Requests left in the current window.
              required: true
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the current window ends.
              required: true
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OfferResponse'
              examples:
                sent:
                  summary: A sent offer
                  value:
                    data:
                      id: 0b0e7c1e-2f6a-4c3b-9d1e-5a4b3c2d1e0f
                      title: Website relaunch
                      status: sent
                      created_at: '2026-10-06T08:15:30.123Z'
                      updated_at: '2026-10-06T08:20:04.317Z'
                      sent_at: '2026-10-06T08:20:04.317Z'
                      expires_at: '2026-10-20T21:59:59.999Z'
                      accepted_at: null
                      expired_at: null
                      version: 2
                      recipient:
                        name: Jane Doe
                        company: Example GmbH
                        email: jane@example.com
                      accepted_by: null
                      value:
                        amount: 480000
                        currency: EUR
                accepted:
                  summary: An accepted offer
                  value:
                    data:
                      id: 5d2c8a40-7b19-4e6f-a3d8-1c9e0f7b2a64
                      title: Brand identity package
                      status: accepted
                      created_at: '2026-09-28T09:00:12.481Z'
                      updated_at: '2026-10-02T14:07:46.001Z'
                      sent_at: '2026-09-29T10:15:00.642Z'
                      expires_at: '2026-10-13T21:59:59.999Z'
                      accepted_at: '2026-10-02T14:07:45.912Z'
                      expired_at: null
                      version: 1
                      recipient:
                        name: John Smith
                        company: Sample AG
                        email: john@example.com
                      accepted_by:
                        name: John Smith
                        email: john@example.com
                      value:
                        amount: 1250000
                        currency: EUR
        '400':
          description: Query string longer than 1024 characters (`invalid_request`).
          headers:
            RateLimit-Limit:
              description: >-
                Requests allowed per window for this API key. Not sent when the
                query string is too long.
              required: false
              schema:
                type: integer
            RateLimit-Remaining:
              description: >-
                Requests left in the current window. Not sent when the query
                string is too long.
              required: false
              schema:
                type: integer
            RateLimit-Reset:
              description: >-
                Seconds until the current window ends. Not sent when the query
                string is too long.
              required: false
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                query_too_long:
                  value:
                    error:
                      code: invalid_request
                      message: Query string too long.
        '401':
          description: >-
            Missing or invalid API key. The response is the same for a missing,
            malformed, unknown, revoked or expired key.
          headers:
            RateLimit-Limit:
              description: >-
                Requests allowed per window for this API key. Not sent when the
                key is missing or malformed.
              required: false
              schema:
                type: integer
            RateLimit-Remaining:
              description: >-
                Requests left in the current window. Not sent when the key is
                missing or malformed.
              required: false
              schema:
                type: integer
            RateLimit-Reset:
              description: >-
                Seconds until the current window ends. Not sent when the key is
                missing or malformed.
              required: false
              schema:
                type: integer
            WWW-Authenticate:
              description: The authentication scheme the API expects. Always `Bearer`.
              required: true
              schema:
                type: string
                examples:
                  - Bearer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                unauthorized:
                  value:
                    error:
                      code: unauthorized
                      message: Missing or invalid API key.
        '404':
          description: >-
            Resource not found. The response is the same for an unknown ID, an
            ID of another workspace and an ID in the wrong form.
          headers:
            RateLimit-Limit:
              description: Requests allowed per window for this API key.
              required: true
              schema:
                type: integer
            RateLimit-Remaining:
              description: Requests left in the current window.
              required: true
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the current window ends.
              required: true
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                not_found:
                  value:
                    error:
                      code: not_found
                      message: Resource not found.
        '405':
          description: >-
            Method not allowed. This API is read-only. Sent for `POST`, `PUT`,
            `PATCH` and `DELETE` on this path. No API key is needed and the rate
            limit headers are not sent.
          headers:
            Allow:
              description: The methods this path accepts.
              required: true
              schema:
                type: string
                examples:
                  - GET, HEAD, OPTIONS
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                method_not_allowed:
                  value:
                    error:
                      code: method_not_allowed
                      message: Method not allowed. This API is read-only.
        '429':
          description: >-
            Too many requests. Either the limit per API key or the limit per IP
            address was reached.
          headers:
            RateLimit-Limit:
              description: >-
                Requests allowed per window for this API key. Not sent when the
                limit per IP address was reached.
              required: false
              schema:
                type: integer
            RateLimit-Remaining:
              description: >-
                Requests left in the current window. Not sent when the limit per
                IP address was reached.
              required: false
              schema:
                type: integer
            RateLimit-Reset:
              description: >-
                Seconds until the current window ends. Not sent when the limit
                per IP address was reached.
              required: false
              schema:
                type: integer
            Retry-After:
              required: true
              description: Seconds to wait before the next request.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                rate_limited:
                  value:
                    error:
                      code: rate_limited
                      message: Too many requests.
        '500':
          description: Internal server error.
          headers:
            RateLimit-Limit:
              description: Requests allowed per window for this API key.
              required: true
              schema:
                type: integer
            RateLimit-Remaining:
              description: Requests left in the current window.
              required: true
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the current window ends.
              required: true
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                internal_error:
                  value:
                    error:
                      code: internal_error
                      message: Internal server error.
components:
  schemas:
    OfferResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/Offer'
      required:
        - data
      description: A single offer.
    ErrorResponse:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - unauthorized
                - not_found
                - invalid_request
                - method_not_allowed
                - rate_limited
                - internal_error
              description: Stable, machine-readable error code.
            message:
              type: string
              description: Human-readable message. May change, do not parse.
            param:
              description: The query parameter that was rejected.
              type: string
          required:
            - code
            - message
      required:
        - error
      description: Every error of the API has this shape.
    Offer:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: ID of the offer.
        title:
          type: string
          description: Title of the offer.
        status:
          $ref: '#/components/schemas/OfferStatus'
        created_at:
          type: string
          format: date-time
          examples:
            - '2026-10-06T08:15:30.123Z'
          description: When the offer was created.
        updated_at:
          type: string
          format: date-time
          examples:
            - '2026-10-06T08:15:30.123Z'
          description: When the offer was last changed.
        sent_at:
          type:
            - string
            - 'null'
          format: date-time
          examples:
            - '2026-10-06T08:15:30.123Z'
          description: When the offer was last sent. Null for a draft.
        expires_at:
          type:
            - string
            - 'null'
          format: date-time
          examples:
            - '2026-10-06T08:15:30.123Z'
          description: Deadline for acceptance. Null for a draft.
        accepted_at:
          type:
            - string
            - 'null'
          format: date-time
          examples:
            - '2026-10-06T08:15:30.123Z'
          description: When the offer was accepted. Null until it is accepted.
        expired_at:
          type:
            - string
            - 'null'
          format: date-time
          examples:
            - '2026-10-06T08:15:30.123Z'
          description: When the offer expired. Only set while `status` is `expired`.
        version:
          type:
            - integer
            - 'null'
          minimum: 1
          description: Number of the version that was last sent. Null for a draft.
        recipient:
          $ref: '#/components/schemas/Recipient'
        accepted_by:
          anyOf:
            - $ref: '#/components/schemas/Signer'
            - type: 'null'
          description: The person who accepted the offer. Null until it is accepted.
        value:
          allOf:
            - $ref: '#/components/schemas/Money'
          description: >-
            Value of the offer: the recommended package of the first visible
            pricing section, otherwise the first package, otherwise 0.
      required:
        - id
        - title
        - status
        - created_at
        - updated_at
        - sent_at
        - expires_at
        - accepted_at
        - expired_at
        - version
        - recipient
        - accepted_by
        - value
      description: An offer with its status, dates, recipient and value.
    OfferStatus:
      type: string
      enum:
        - draft
        - sent
        - accepted
        - declined
        - expired
        - withdrawn
      description: >-
        Current status of an offer. A sent offer whose `expires_at` has passed
        is reported as `expired`.
    Recipient:
      type: object
      properties:
        name:
          description: Name of the recipient.
          type:
            - string
            - 'null'
        company:
          description: Company of the recipient.
          type:
            - string
            - 'null'
        email:
          description: Email address of the recipient.
          type:
            - string
            - 'null'
      required:
        - name
        - company
        - email
      description: The person the offer was sent to. All fields are null for a draft.
    Signer:
      type: object
      properties:
        name:
          type: string
          description: Name the signer entered.
        email:
          type: string
          description: Email address of the signer.
      required:
        - name
        - email
      description: The person who accepted the offer.
    Money:
      type: object
      properties:
        amount:
          type: integer
          minimum: 0
          description: Amount in the smallest currency unit (for example cents).
          examples:
            - 480000
        currency:
          type: string
          description: ISO 4217 currency code.
          examples:
            - EUR
      required:
        - amount
        - currency
      description: An amount of money.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API key
      description: API key, for example `hd_live_…`.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.