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

# List offers

> Newest first (by `created_at`). Use `next_cursor` to page.



## OpenAPI

````yaml /api-reference/openapi.json get /offers
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:
    get:
      tags:
        - Offers
      summary: List offers
      description: Newest first (by `created_at`). Use `next_cursor` to page.
      operationId: listOffers
      parameters:
        - name: status
          in: query
          required: false
          description: Only offers with this status.
          schema:
            type: string
            enum:
              - draft
              - sent
              - accepted
              - declined
              - expired
              - withdrawn
        - name: limit
          in: query
          required: false
          description: Page size, 1 to 100.
          schema:
            default: 25
            type: integer
            minimum: 1
            maximum: 100
        - name: cursor
          in: query
          required: false
          description: Opaque cursor from `next_cursor` of the previous page.
          schema:
            type: string
            minLength: 1
            maxLength: 512
      responses:
        '200':
          description: A page of offers.
          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/OfferListResponse'
              examples:
                page:
                  summary: A page with a next page
                  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
                      - 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
                    next_cursor: >-
                      eyJjIjoiMjAyNi0wOS0yOFQwOTowMDoxMi40ODEwMDBaIiwiaSI6IjVkMmM4YTQwLTdiMTktNGU2Zi1hM2Q4LTFjOWUwZjdiMmE2NCJ9
                last_page:
                  summary: The last page
                  value:
                    data:
                      - id: c7a91e3d-48b2-4f05-86de-3a1b5c7d9e02
                        title: Campaign retainer
                        status: expired
                        created_at: '2026-09-01T07:30:00.000Z'
                        updated_at: '2026-09-15T22:00:00.250Z'
                        sent_at: '2026-09-02T08:00:11.205Z'
                        expires_at: '2026-09-15T21:59:59.999Z'
                        accepted_at: null
                        expired_at: '2026-09-15T21:59:59.999Z'
                        version: 1
                        recipient:
                          name: Alex Example
                          company: Placeholder Ltd
                          email: alex@example.com
                        accepted_by: null
                        value:
                          amount: 90000
                          currency: EUR
                    next_cursor: null
        '400':
          description: >-
            Invalid query parameter, or a 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:
                invalid_parameter:
                  value:
                    error:
                      code: invalid_request
                      message: Invalid value for query parameter "limit".
                      param: limit
                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.
        '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:
    OfferListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Offer'
          description: The offers of this page, newest first.
        next_cursor:
          description: Pass as `cursor` to fetch the next page. Null on the last page.
          type:
            - string
            - 'null'
      required:
        - data
        - next_cursor
      description: A page of offers.
    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.