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

# Get a delivery

> The delivery with its payload and every attempt.




## OpenAPI

````yaml /openapi.json get /v1/webhook-deliveries/{delivery_id}
openapi: 3.1.1
info:
  title: Nohead API
  version: 1.0.0
  summary: Programmable content and data API.
  contact:
    name: Nohead
    email: hello@nohead.io
    url: https://nohead.io
  description: >
    The Nohead API manages projects, collections (your data models), their

    fields, and records (your content), with full version history.


    ## Authentication


    Send `Authorization: Bearer <token>`. Servers, CI and agents use a

    project API key (`nohead_sk_...`, or `nohead_pk_...` for a published-only

    key; created in the web app under API keys)

    with scopes such as `records:read` or `schema:write`. Organization,

    project, member and API key management need a person signed in to the

    web app and are not available to API keys.


    ## Resources and IDs


    Every object has an `object` type, and every resource with an identity of

    its own an opaque, prefixed `id` (`col_`, `fld_`, `rec_`, ...). Record
    values live under `data`, keyed by each

    field's `key`. Timestamps are ISO 8601 in UTC. Deleting a record,

    collection, field, asset or webhook is soft: it can be restored until its

    `purge_after`.


    ## Lists


    Lists return `{ "data": [...], "meta": { "next_cursor", "has_more" } }`.

    Pass `limit` (1-100) and `cursor` to page, and `sort` (prefix `-` for

    descending). Records also take `filter[<key>]=value`,

    `filter[published_at][exists]=true` and `expand=<relation, asset or

    rich text fields>`.


    ## Errors


    Errors share one envelope: `{ "error": { "type", "message",

    "request_id", "details" } }`. `details` lists field-level problems as

    `{ "field", "code", "message" }`. Include the `request_id` when asking

    for support.


    ## Safe retries and concurrent edits


    Send `Idempotency-Key` on any `POST`, `PUT`, `PATCH` or `DELETE` to make
    retrying

    it safe: the first result is stored for 24 hours and returned again for

    the same request. Record responses carry the record's revision as an

    `ETag`; send it back as `If-Match` to update only if nobody changed the

    record in the meantime (`412` otherwise).


    ## History


    Every change to a record is a revision, attributed to the person or API

    key that made it: record revisions can be listed, diffed and reverted,

    and collections keep a schema history. Send `Nohead-Change-Note` to

    record why a change was made. Changes that rewrite existing values

    (such as a field's type) are explicit, previewable field migrations.


    How long revisions are kept depends on the organization's plan. Older

    ones are removed, but every record keeps its first revision and its

    last 10; `history_pruned_through` says how far history was removed.
  license:
    name: Proprietary
    identifier: LicenseRef-Proprietary
servers:
  - url: https://api.nohead.io
    description: Production
security:
  - apiKey: []
tags:
  - name: records
    x-group: Records
    description: Content entries, one at a time or many at once.
  - name: publishing
    x-group: Publishing
    description: Making records live, now or at a set time, and taking them down.
  - name: revisions
    x-group: Revisions
    description: A record's history, comparing two revisions, and going back to one.
  - name: drafts
    x-group: Drafts
    description: Changes to a record that wait to be merged into it, now or at a set time.
  - name: collections
    x-group: Collections
    description: User-defined data models.
  - name: schema-changes
    x-group: Schema changes
    description: A collection's schema history, and its schema at any version.
  - name: fields
    x-group: Fields
    description: Field definitions of a collection.
  - name: migrations
    x-group: Field migrations
    description: Explicit field changes that rewrite existing record values, with previews.
  - name: assets
    x-group: Assets
    description: Files stored for a project, uploaded directly to storage.
  - name: search
    x-group: Search
    description: Full-text search in collections and across a project.
  - name: webhooks
    x-group: Webhooks
    description: Event notifications sent to your URLs, and the secrets that sign them.
  - name: deliveries
    x-group: Webhook deliveries
    description: Each event sent to a webhook, its attempts, and retrying it.
  - name: audit
    x-group: Activity log
    description: The append-only trail of who changed what, through which client.
  - name: system
    x-group: System
    description: Service status, the caller, and its feature flags.
paths:
  /v1/webhook-deliveries/{delivery_id}:
    parameters:
      - $ref: '#/components/parameters/DeliveryId'
    get:
      tags:
        - deliveries
      summary: Get a delivery
      description: |
        The delivery with its payload and every attempt.
      operationId: webhook_deliveries_get
      responses:
        '200':
          description: The delivery.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookDeliveryDetail'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
      x-codeSamples:
        - lang: typescript
          label: TypeScript
          source: >
            import { Nohead } from "@nohead/sdk"


            const nohead = new Nohead()


            const result = await
            nohead.webhooks.deliveries.get("whd_01J9ZQ3F8X")
        - lang: python
          label: Python
          source: |
            from nohead import Nohead

            nohead = Nohead()

            result = nohead.webhooks.deliveries.get("whd_01J9ZQ3F8X")
        - lang: ruby
          label: Ruby
          source: |
            require "nohead"

            nohead = Nohead::Client.new

            result = nohead.webhooks.deliveries.get("whd_01J9ZQ3F8X")
components:
  parameters:
    DeliveryId:
      name: delivery_id
      in: path
      required: true
      schema:
        type: string
      example: whd_01J9ZQ3F8X5W2K7M4N6P0R1S2T
  schemas:
    WebhookDeliveryDetail:
      allOf:
        - $ref: '#/components/schemas/WebhookDeliveryProperties'
        - type: object
          required:
            - payload
            - attempts
          properties:
            payload:
              $ref: '#/components/schemas/WebhookEventPayload'
            attempts:
              type: array
              items:
                type: object
                additionalProperties: false
                required:
                  - number
                  - status_code
                  - error
                  - duration_ms
                  - response_body
                  - created_at
                properties:
                  number:
                    type: integer
                  status_code:
                    type:
                      - integer
                      - 'null'
                  error:
                    type:
                      - string
                      - 'null'
                  duration_ms:
                    type: integer
                  response_body:
                    type:
                      - string
                      - 'null'
                    description: The first 2 KB of the response.
                  created_at:
                    $ref: '#/components/schemas/Timestamp'
      unevaluatedProperties: false
    WebhookDeliveryProperties:
      type: object
      required:
        - id
        - object
        - webhook_id
        - event
        - status
        - attempts_count
        - last_status_code
        - last_error
        - last_attempt_at
        - next_attempt_at
        - succeeded_at
        - created_at
      properties:
        id:
          type: string
          examples:
            - whd_01J9ZQ3F8X5W2K7M4N6P0R1S2T
        object:
          const: webhook_delivery
        webhook_id:
          type: string
        event:
          type: object
          additionalProperties: false
          required:
            - id
            - type
            - created_at
          properties:
            id:
              type: string
              description: The event ID, sent as `webhook-id`; the same on every attempt.
            type:
              type: string
            created_at:
              $ref: '#/components/schemas/Timestamp'
        status:
          type: string
          enum:
            - pending
            - succeeded
            - failed
          description: >-
            `pending` until an attempt gets a 2xx response; `failed` after 8
            attempts over about a day.
        attempts_count:
          type: integer
        last_status_code:
          type:
            - integer
            - 'null'
        last_error:
          type:
            - string
            - 'null'
        last_attempt_at:
          $ref: '#/components/schemas/NullableTimestamp'
        next_attempt_at:
          $ref: '#/components/schemas/NullableTimestamp'
        succeeded_at:
          $ref: '#/components/schemas/NullableTimestamp'
        created_at:
          $ref: '#/components/schemas/Timestamp'
    WebhookEventPayload:
      type: object
      additionalProperties: false
      required:
        - id
        - object
        - type
        - created_at
        - project_id
        - actor
        - via
        - data
      description: |
        The JSON body of every webhook request. It is rendered from the event's
        history each time it is sent or shown, so redacted values are redacted
        in it too. `data` depends on the `type`.
      properties:
        id:
          type: string
          description: The event's ID, also sent as `webhook-id`; dedupe by it.
          examples:
            - evt_01J9ZQ3F8X5W2K7M4N6P0R1S2T
        object:
          const: event
        type:
          anyOf:
            - $ref: '#/components/schemas/WebhookEventType'
            - const: webhook.test
        created_at:
          $ref: '#/components/schemas/Timestamp'
        project_id:
          type: string
        actor:
          description: Who made the change.
          allOf:
            - $ref: '#/components/schemas/Actor'
        via:
          description: |
            The client the change came through (null when not known). An
            integration that writes back can skip changes made with its own API
            key (`actor`).
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/Via'
        data:
          oneOf:
            - $ref: '#/components/schemas/RecordEventData'
            - $ref: '#/components/schemas/DraftEventData'
            - $ref: '#/components/schemas/AssetEventData'
            - $ref: '#/components/schemas/SchemaEventData'
            - $ref: '#/components/schemas/FieldAliasEventData'
            - $ref: '#/components/schemas/WebhookTestEventData'
    Timestamp:
      type: string
      format: date-time
      description: ISO 8601 timestamp in UTC.
      examples:
        - '2026-09-27T12:00:00.000Z'
    Error:
      type: object
      additionalProperties: false
      required:
        - error
      properties:
        error:
          type: object
          additionalProperties: false
          required:
            - type
            - message
            - request_id
          properties:
            type:
              $ref: '#/components/schemas/ErrorType'
            message:
              type: string
            request_id:
              $ref: '#/components/schemas/RequestId'
            details:
              type: array
              items:
                $ref: '#/components/schemas/ErrorDetail'
    NullableTimestamp:
      type:
        - string
        - 'null'
      format: date-time
    WebhookEventType:
      type: string
      description: >
        An event webhooks can subscribe to: the same names as the activity

        log's actions. A subscription can also be every type of a resource

        (`record.*`, `draft.*`, `collection.*`, `field.*`, `asset.*`) or `*` for
        all.
      enum:
        - record.created
        - record.updated
        - record.published
        - record.unpublished
        - record.deleted
        - record.restored
        - record.reverted
        - record.redacted
        - record.scheduled
        - record.unscheduled
        - record.schedule_failed
        - draft.created
        - draft.updated
        - draft.discarded
        - draft.scheduled
        - draft.unscheduled
        - draft.schedule_failed
        - collection.created
        - collection.updated
        - collection.deleted
        - collection.restored
        - collection.fields_reordered
        - field.created
        - field.updated
        - field.deleted
        - field.restored
        - field.migrated
        - field.alias_removed
        - asset.created
        - asset.updated
        - asset.deleted
        - asset.restored
        - asset.purged
    Actor:
      type: object
      additionalProperties: false
      required:
        - type
        - id
        - name
      properties:
        type:
          type: string
          enum:
            - user
            - api_key
            - system
        id:
          type:
            - string
            - 'null'
          description: >-
            The user (`usr_...`) or API key (`key_...`), or null for system
            changes.
        name:
          type:
            - string
            - 'null'
          description: |
            Resolved when read, never stored: a user's current name (or
            email), "Deleted user" once they deleted their account, an API
            key's name, or "System".
    Via:
      type: string
      description: The client a change came through; `scheduler` for scheduled changes.
      enum:
        - ui
        - api
        - cli
        - sdk
        - mcp
        - system
        - scheduler
    RecordEventData:
      type: object
      additionalProperties: false
      required:
        - record
        - revision
        - revision_id
      description: >-
        `record.*`: the record as the change's revision left it, or as it is now
        for events without a revision (`record.scheduled`, `record.unscheduled`,
        `record.schedule_failed`, `record.redacted`).
      properties:
        record:
          description: Null once the record is purged.
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/Record'
        revision:
          type:
            - integer
            - 'null'
        revision_id:
          type:
            - string
            - 'null'
          description: Null for events without a revision.
        draft_id:
          type: string
          description: On the `record.updated` of a merged draft, the draft it merged.
    DraftEventData:
      type: object
      additionalProperties: false
      required:
        - draft
        - draft_id
        - record_id
      description: '`draft.*`: the draft as it is now.'
      properties:
        draft:
          description: Null once merged or discarded, and while its record is deleted.
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/Draft'
        draft_id:
          type: string
          description: The draft's ID, also once it is gone.
        record_id:
          type: string
    AssetEventData:
      type: object
      additionalProperties: false
      required:
        - asset
      description: '`asset.*`: the asset as it is now.'
      properties:
        asset:
          oneOf:
            - $ref: '#/components/schemas/Asset'
            - type: object
              description: Only its ID once it is purged.
              additionalProperties: false
              required:
                - id
                - object
              properties:
                id:
                  type: string
                object:
                  const: asset
    SchemaEventData:
      type: object
      additionalProperties: false
      required:
        - collection
        - schema_change
      description: >-
        `collection.*` and `field.*` (but `field.alias_removed`): the collection
        as the change left it, and the change.
      properties:
        collection:
          type: object
          additionalProperties: false
          required:
            - id
            - object
            - slug
            - name
            - schema_version
            - deleted_at
          description: >-
            Only `id` and `object` are known once the schema change is gone (the
            collection was purged).
          properties:
            id:
              type: string
            object:
              const: collection
            slug:
              type:
                - string
                - 'null'
            name:
              type:
                - string
                - 'null'
            schema_version:
              type:
                - integer
                - 'null'
            deleted_at:
              $ref: '#/components/schemas/NullableTimestamp'
        field_id:
          type: string
          description: '`field.*`: the field that changed.'
        schema_change:
          oneOf:
            - type: 'null'
            - type: object
              additionalProperties: false
              required:
                - id
                - operation
                - from_version
                - to_version
              properties:
                id:
                  type: string
                operation:
                  type: string
                from_version:
                  type: integer
                to_version:
                  type: integer
    FieldAliasEventData:
      type: object
      additionalProperties: false
      required:
        - field
      description: '`field.alias_removed`: the field.'
      properties:
        field:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/Field'
    WebhookTestEventData:
      type: object
      additionalProperties: false
      required:
        - webhook
      description: '`webhook.test`: the webhook it was sent to.'
      properties:
        webhook:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/Webhook'
    RequestId:
      type: string
      pattern: ^req_[A-Za-z0-9]+$
      examples:
        - req_01J9ZQ3F8X5W2K7M4N6P0R1S2T
    ErrorType:
      type: string
      enum:
        - invalid_request
        - authentication_error
        - plan_limit_exceeded
        - authorization_error
        - not_found
        - conflict
        - precondition_failed
        - validation_error
        - rate_limited
        - internal_error
        - service_unavailable
    ErrorDetail:
      type: object
      additionalProperties: false
      required:
        - code
        - message
      properties:
        field:
          type: string
          description: Key of the offending field or parameter, when applicable.
        code:
          type: string
          description: Machine-readable error code, e.g. `required`.
        message:
          type: string
        usage:
          type: integer
          description: Current usage, for `plan_limit` details.
        limit:
          type: integer
          description: The plan's limit, for `plan_limit` details.
        current_revision:
          type: integer
          description: The resource's current revision, for `revision_mismatch` details.
        record_id:
          type: string
          description: The record that already has the value, for `taken` details.
        draft_id:
          type: string
          description: The record's draft, for `draft_exists` and `draft_pending` details.
    Record:
      type: object
      additionalProperties: false
      required:
        - id
        - object
        - collection_id
        - collection
        - published_at
        - revision
        - schema_version
        - deleted_at
        - purge_after
        - history_pruned_through
        - data
        - created_at
        - updated_at
      properties:
        id:
          type: string
          examples:
            - rec_01J9ZQ3F8X5W2K7M4N6P0R1S2T
        object:
          const: record
        collection_id:
          type: string
        collection:
          type: string
          description: The collection slug.
        published_at:
          $ref: '#/components/schemas/NullableTimestamp'
          description: When the record was published; null while it is unpublished.
        revision:
          type: integer
          description: Current revision number; also returned as the ETag.
        schema_version:
          type: integer
        history_pruned_through:
          type:
            - integer
            - 'null'
          description: >-
            Revisions up to this number (except revision 1) were removed by the
            plan's history retention.
        deleted_at:
          $ref: '#/components/schemas/NullableTimestamp'
          description: When the record was soft-deleted; null unless it is.
        purge_after:
          $ref: '#/components/schemas/NullableTimestamp'
          description: >-
            When a soft-deleted record is removed for good, unless restored
            first.
        data:
          $ref: '#/components/schemas/RecordData'
        expanded:
          type: object
          description: >
            Only with `expand`: what each requested relation, asset or rich

            text field points at, keyed by field key: records for

            relation fields, assets for asset fields. A single value is the
            object, or null when

            it no longer exists; a multiple value is a list of those that still

            exist. For a rich text field, the list of assets its images show,

            in document order, leaving out those that no longer exist.

            Expanded records are not expanded further.
          additionalProperties:
            anyOf:
              - $ref: '#/components/schemas/Record'
              - $ref: '#/components/schemas/Asset'
              - type: 'null'
              - type: array
                items:
                  anyOf:
                    - $ref: '#/components/schemas/Record'
                    - $ref: '#/components/schemas/Asset'
        created_at:
          $ref: '#/components/schemas/Timestamp'
        updated_at:
          $ref: '#/components/schemas/Timestamp'
    Draft:
      type: object
      additionalProperties: false
      required:
        - id
        - object
        - record_id
        - collection_id
        - collection
        - base_revision
        - revision
        - data
        - changed_fields
        - schedule
        - created_by
        - edited_by
        - created_at
        - updated_at
      description: |
        Changes to a record's content that wait until they are merged into
        it, now or at `schedule.merge_at`. Content only: whether the record
        is live is its publication and schedule.
      properties:
        id:
          type: string
          examples:
            - drf_01J9ZQ3F8X5W2K7M4N6P0R1S2T
        object:
          const: draft
        record_id:
          type: string
        collection_id:
          type: string
        collection:
          type: string
          description: The collection slug.
        base_revision:
          type: integer
          description: >
            The record's revision when the draft started. Fields the record

            changed since keep their values at the merge, unless the draft

            changes them too; compare with `GET
            /v1/records/{id}/diff?from=<base_revision>`.
        revision:
          type: integer
          description: >-
            The draft's own revision, 1 when started and one more per change;
            also returned as the ETag.
        data:
          $ref: '#/components/schemas/RecordData'
          description: The record's values as they read after the merge.
        changed_fields:
          type: array
          description: Keys of the fields the draft changes.
          items:
            type: string
        schedule:
          $ref: '#/components/schemas/DraftSchedule'
        created_by:
          $ref: '#/components/schemas/Actor'
        edited_by:
          type: array
          description: Everyone who changed it since, in order.
          items:
            $ref: '#/components/schemas/Actor'
        expanded:
          type: object
          description: Only with `expand`, as on a record, for the values after the merge.
          additionalProperties:
            anyOf:
              - $ref: '#/components/schemas/Record'
              - $ref: '#/components/schemas/Asset'
              - type: 'null'
              - type: array
                items:
                  anyOf:
                    - $ref: '#/components/schemas/Record'
                    - $ref: '#/components/schemas/Asset'
        created_at:
          $ref: '#/components/schemas/Timestamp'
        updated_at:
          $ref: '#/components/schemas/Timestamp'
    Asset:
      allOf:
        - $ref: '#/components/schemas/AssetProperties'
      unevaluatedProperties: false
    Field:
      description: >-
        A field, typed by its `type`, which also decides the options its
        `configuration` takes.
      oneOf:
        - $ref: '#/components/schemas/TextField'
        - $ref: '#/components/schemas/LongTextField'
        - $ref: '#/components/schemas/RichTextField'
        - $ref: '#/components/schemas/IntegerField'
        - $ref: '#/components/schemas/DecimalField'
        - $ref: '#/components/schemas/DateField'
        - $ref: '#/components/schemas/BooleanField'
        - $ref: '#/components/schemas/EnumField'
        - $ref: '#/components/schemas/AssetField'
        - $ref: '#/components/schemas/RelationField'
        - $ref: '#/components/schemas/JsonField'
      discriminator:
        propertyName: type
        mapping:
          text: '#/components/schemas/TextField'
          long_text: '#/components/schemas/LongTextField'
          rich_text: '#/components/schemas/RichTextField'
          integer: '#/components/schemas/IntegerField'
          decimal: '#/components/schemas/DecimalField'
          date: '#/components/schemas/DateField'
          boolean: '#/components/schemas/BooleanField'
          enum: '#/components/schemas/EnumField'
          asset: '#/components/schemas/AssetField'
          relation: '#/components/schemas/RelationField'
          json: '#/components/schemas/JsonField'
    Webhook:
      allOf:
        - $ref: '#/components/schemas/WebhookProperties'
      unevaluatedProperties: false
    RecordData:
      type: object
      description: >
        Field values keyed by field `key`.


        A rich text value is written as Markdown (GitHub Flavored, a string)

        or as a ProseMirror JSON document (`{"type": "doc", "content": [...]}`),

        and stored and read as the document (`rich_text` reads it as HTML or

        Markdown). Markdown is converted as closely as the vocabulary allows:

        headings below h3 become h3, task list items plain items, footnotes and

        raw HTML text. A document uses the web editor's vocabulary (Tiptap's

        StarterKit and tables) and nothing else; another name is refused with

        `invalid_format`, naming ours where one fits (`strong` is `bold`):


        - blocks: `paragraph`, `heading` (`level` 1-3), `blockquote`,
          `bulletList` and `orderedList` (`start`, `type`) of `listItem`
          (starting with a paragraph), `codeBlock` (`language`),
          `horizontalRule`, and `table` of `tableRow` of `tableHeader` or
          `tableCell` (`colspan`, `rowspan`, `colwidth`, `align`); any block
          may have `dir` (`auto`, `ltr`, `rtl`);
        - inline: `text` (non-empty) and `hardBreak`;

        - marks on text: `bold`, `italic`, `strike`, `underline`, `code`
        (alone),
          and `link` (`href`, and `target`, `rel`, `class`, `title`); a link's
          `href` is an `http`, `https`, `mailto`, `tel` or relative URL.

        An image of an asset is `{"type": "image", "attrs": {"asset_id":

        "ast_...", "alt": "..."}}` (in Markdown `![alt](ast_...)`, or the

        asset's `image_url`), between the document's blocks (not inside a list,

        quote or table), at most 100 per document (`too_many_images`); a newly

        shown image must be an uploaded JPEG, PNG, GIF, WebP, AVIF or SVG of

        the project (`invalid_reference`, `type_not_accepted`). `expand` embeds

        the assets, and published-only keys can read the images of published

        records. A record holds at

        most 2,000,000 bytes of values, all fields together (`too_large` on

        `data`); one already larger can still be edited without growing.
      additionalProperties: true
      examples:
        - title: Introducing Foo
          body:
            type: doc
            content: []
    DraftSchedule:
      type: object
      additionalProperties: false
      required:
        - merge_at
        - last_error
      description: |
        When the draft merges on its own (within a minute of the time), set
        with `PUT /v1/drafts/{draft_id}/schedule`. `last_error` explains the
        last scheduled merge that could not be made, until a new one is set.
      properties:
        merge_at:
          $ref: '#/components/schemas/NullableTimestamp'
        last_error:
          type:
            - string
            - 'null'
    AssetProperties:
      type: object
      required:
        - id
        - object
        - project_id
        - filename
        - alt
        - content_type
        - byte_size
        - width
        - height
        - status
        - deleted_at
        - purge_after
        - image_url
        - preview_url
        - file_url
        - media_url
        - uploaded_at
        - created_at
        - updated_at
      properties:
        id:
          type: string
          examples:
            - ast_01J9ZQ3F8X5W2K7M4N6P0R1S2T
        object:
          const: asset
        project_id:
          type: string
        filename:
          type: string
          description: >-
            The filename, any Unicode, as uploaded unless renamed since.
            Downloads use it.
        alt:
          type:
            - string
            - 'null'
          maxLength: 1000
          description: >-
            Alternative text, saying what an image shows; null until set. The
            default wherever the asset is used.
        content_type:
          type: string
          examples:
            - image/png
        byte_size:
          type: integer
        width:
          type:
            - integer
            - 'null'
          description: Pixel width, for images.
        height:
          type:
            - integer
            - 'null'
        status:
          type: string
          enum:
            - pending
            - ready
            - failed
          description: >-
            `pending` until the upload is completed; only `ready` assets can be
            used in records.
        deleted_at:
          $ref: '#/components/schemas/NullableTimestamp'
          description: When the asset was deleted; null unless it is.
        purge_after:
          $ref: '#/components/schemas/NullableTimestamp'
          description: >-
            When a deleted asset and its file are removed for good, unless
            restored or purged first.
        image_url:
          type:
            - string
            - 'null'
          format: uri
          description: >
            The URL of the whole image, for ready images (JPEG, PNG, GIF, WebP,

            AVIF or SVG), deleted ones included until they are purged; null

            otherwise. Image URLs are open and never expire. An SVG is served

            as SVG without its scripts, unless a format such as `@webp`

            rasterizes it. For a rendition,

            write [imgproxy processing
            options](https://docs.imgproxy.net/usage/processing)

            before `/plain/`, and a format after `@`: for example

            `https://images.nohead.io/rs:fill:800:600/g:sm/plain/…@webp`.
            Renditions

            are at most 4096 pixels a side, from originals of at most 50

            megapixels. Options that would return the file as stored (`raw`,

            `skip_processing`, `strip_metadata`) are refused.
          examples:
            - >-
              https://images.nohead.io/plain/0199f5c2-7b1e-7c3a-9d4f-2a6b8c0e1f3d/0199f5c2-8a2d-7e4b-b1c3-5d7e9f1a2b4c
        preview_url:
          type:
            - string
            - 'null'
          format: uri
          description: >-
            The URL of a small rendition (fits in 640×640, WebP), for ready
            images and SVGs (rasterized), deleted ones included until they are
            purged; null otherwise.
        file_url:
          type:
            - string
            - 'null'
          format: uri
          description: |
            The URL of the file as uploaded, for ready assets of any type,
            deleted ones included until they are purged; null otherwise. It
            downloads the file under its `filename` (a rename applies within a
            minute or so), is open and never expires, and is cached on a CDN.
          examples:
            - >-
              https://files.nohead.io/0199f5c2-7b1e-7c3a-9d4f-2a6b8c0e1f3d/0199f5c2-8a2d-7e4b-b1c3-5d7e9f1a2b4c
        media_url:
          type:
            - string
            - 'null'
          format: uri
          description: |
            The URL that plays a ready video or audio file inline, for
            `<video>` and `<audio>` (with range requests, so players can seek),
            deleted ones included until they are purged: MP4, QuickTime, M4A,
            3GP, WebM, Matroska, MP3, AAC, FLAC, WAV and Ogg (whose content is
            checked when the upload completes). Null for other types, which
            `file_url` downloads.
            Open, never expiring and cached on a CDN, like `file_url`.
          examples:
            - >-
              https://media.nohead.io/0199f5c2-7b1e-7c3a-9d4f-2a6b8c0e1f3d/0199f5c2-8a2d-7e4b-b1c3-5d7e9f1a2b4c
        uploaded_at:
          $ref: '#/components/schemas/NullableTimestamp'
        created_at:
          $ref: '#/components/schemas/Timestamp'
        updated_at:
          $ref: '#/components/schemas/Timestamp'
    TextField:
      allOf:
        - $ref: '#/components/schemas/FieldProperties'
        - type: object
          required:
            - type
            - configuration
          properties:
            type:
              const: text
            configuration:
              $ref: '#/components/schemas/TextFieldConfiguration'
      unevaluatedProperties: false
    LongTextField:
      allOf:
        - $ref: '#/components/schemas/FieldProperties'
        - type: object
          required:
            - type
            - configuration
          properties:
            type:
              const: long_text
            configuration:
              $ref: '#/components/schemas/LongTextFieldConfiguration'
      unevaluatedProperties: false
    RichTextField:
      allOf:
        - $ref: '#/components/schemas/FieldProperties'
        - type: object
          required:
            - type
            - configuration
          properties:
            type:
              const: rich_text
            configuration:
              $ref: '#/components/schemas/RichTextFieldConfiguration'
      unevaluatedProperties: false
    IntegerField:
      allOf:
        - $ref: '#/components/schemas/FieldProperties'
        - type: object
          required:
            - type
            - configuration
          properties:
            type:
              const: integer
            configuration:
              $ref: '#/components/schemas/IntegerFieldConfiguration'
      unevaluatedProperties: false
    DecimalField:
      allOf:
        - $ref: '#/components/schemas/FieldProperties'
        - type: object
          required:
            - type
            - configuration
          properties:
            type:
              const: decimal
            configuration:
              $ref: '#/components/schemas/DecimalFieldConfiguration'
      unevaluatedProperties: false
    DateField:
      allOf:
        - $ref: '#/components/schemas/FieldProperties'
        - type: object
          required:
            - type
            - configuration
          properties:
            type:
              const: date
            configuration:
              $ref: '#/components/schemas/DateFieldConfiguration'
      unevaluatedProperties: false
    BooleanField:
      allOf:
        - $ref: '#/components/schemas/FieldProperties'
        - type: object
          required:
            - type
            - configuration
          properties:
            type:
              const: boolean
            configuration:
              $ref: '#/components/schemas/BooleanFieldConfiguration'
      unevaluatedProperties: false
    EnumField:
      allOf:
        - $ref: '#/components/schemas/FieldProperties'
        - type: object
          required:
            - type
            - configuration
          properties:
            type:
              const: enum
            configuration:
              $ref: '#/components/schemas/EnumFieldConfiguration'
      unevaluatedProperties: false
    AssetField:
      allOf:
        - $ref: '#/components/schemas/FieldProperties'
        - type: object
          required:
            - type
            - configuration
          properties:
            type:
              const: asset
            configuration:
              $ref: '#/components/schemas/AssetFieldConfiguration'
      unevaluatedProperties: false
    RelationField:
      allOf:
        - $ref: '#/components/schemas/FieldProperties'
        - type: object
          required:
            - type
            - configuration
          properties:
            type:
              const: relation
            configuration:
              $ref: '#/components/schemas/RelationFieldConfiguration'
      unevaluatedProperties: false
    JsonField:
      allOf:
        - $ref: '#/components/schemas/FieldProperties'
        - type: object
          required:
            - type
            - configuration
          properties:
            type:
              const: json
            configuration:
              $ref: '#/components/schemas/JsonFieldConfiguration'
      unevaluatedProperties: false
    WebhookProperties:
      type: object
      required:
        - id
        - object
        - project_id
        - url
        - description
        - event_types
        - published_only
        - enabled
        - deleted_at
        - purge_after
        - created_at
        - updated_at
      properties:
        id:
          type: string
          examples:
            - wh_01J9ZQ3F8X5W2K7M4N6P0R1S2T
        object:
          const: webhook
        project_id:
          type: string
        url:
          type: string
          format: uri
        description:
          type:
            - string
            - 'null'
        event_types:
          type: array
          description: >-
            The subscribed event types and wildcards (`record.*`, or `*` for
            all).
          items:
            $ref: '#/components/schemas/WebhookSubscription'
        published_only:
          type: boolean
          description: >-
            Send only events that change what a published-only API key can read:
            a record's change while it is published (or that publishes,
            unpublishes, deletes or restores it), schema changes, and changes to
            assets that published records use. Drafts, schedules, history
            redactions, uploads and purges are never sent. `webhook.test` always
            is.
        enabled:
          type: boolean
        deleted_at:
          $ref: '#/components/schemas/NullableTimestamp'
          description: When the webhook was deleted; null unless it is.
        purge_after:
          $ref: '#/components/schemas/NullableTimestamp'
          description: >-
            When a deleted webhook is removed for good, with its delivery log,
            unless restored first.
        created_at:
          $ref: '#/components/schemas/Timestamp'
        updated_at:
          $ref: '#/components/schemas/Timestamp'
    FieldProperties:
      type: object
      description: >-
        What every field has; `Field` adds its `type` and that type's
        `configuration`.
      required:
        - id
        - object
        - collection_id
        - name
        - key
        - required
        - multiple
        - position
        - deleted_at
        - purge_after
        - aliases
        - created_at
        - updated_at
      properties:
        id:
          type: string
          description: Stable field ID. Never changes, even when the field is renamed.
          examples:
            - fld_01J9ZQ3F8X5W2K7M4N6P0R1S2T
        object:
          const: field
        collection_id:
          type: string
        name:
          type: string
          description: Display name. Safe to change.
        key:
          type: string
          description: Key used in record data. Part of the API contract.
        required:
          type: boolean
          description: >-
            Every record must have a value. Not available for boolean fields (a
            boolean is true or false; no value reads as false).
        multiple:
          type: boolean
          description: >-
            A list of distinct values (a repeated value is refused with
            `duplicate_value`, an empty string with `blank_value`). Not
            available for boolean, long_text, rich_text and json fields.
        position:
          type: integer
          description: >-
            Where the field sorts in the collection's order, lowest first. New
            fields are added last; `PUT
            /v1/collections/{collection_id}/field-order` changes the order,
            numbering the fields from 0.
        deleted_at:
          $ref: '#/components/schemas/NullableTimestamp'
          description: >-
            When the field was deleted; null unless it is. Its values stay
            hidden in records until it is restored or purged.
        purge_after:
          $ref: '#/components/schemas/NullableTimestamp'
          description: >-
            When a deleted field and its values are removed for good, unless
            restored first.
        aliases:
          type: array
          description: |
            Old keys of a renamed field that still work until `expires_at`:
            record data also carries the value under them, and writes, filters,
            sorts and `expand` accept them. Responses about the collection then
            have `Deprecation` and `Sunset` headers.
          items:
            type: object
            additionalProperties: false
            required:
              - key
              - expires_at
            properties:
              key:
                type: string
              expires_at:
                $ref: '#/components/schemas/Timestamp'
        created_at:
          $ref: '#/components/schemas/Timestamp'
        updated_at:
          $ref: '#/components/schemas/Timestamp'
    TextFieldConfiguration:
      type: object
      additionalProperties: false
      description: Plain text up to 10,000 characters, or a `format`.
      properties:
        description:
          type: string
          maxLength: 500
          description: Help text for editors.
        searchable:
          type: boolean
          description: >-
            Search words match the field, in every search (API keys, search
            tokens, members). Default true for text, long_text, rich_text and
            enum.
        filterable:
          type: boolean
          description: API searches can filter on it. Default false.
        sortable:
          type: boolean
          description: API searches can sort on it (one value only). Default false.
        min_length:
          type: integer
          minimum: 0
        max_length:
          type: integer
          minimum: 0
        format:
          type: string
          enum:
            - slug
            - url
            - email
          description: >-
            `slug` (always unique, one value), `url` (absolute http or https) or
            `email`; each sets its own length limits.
        unique:
          type: boolean
          description: >-
            No two active records of the collection share a value (one value
            only; a slug is always unique).
    LongTextFieldConfiguration:
      type: object
      additionalProperties: false
      description: Text up to 100,000 characters.
      properties:
        description:
          type: string
          maxLength: 500
          description: Help text for editors.
        searchable:
          type: boolean
          description: >-
            Search words match the field, in every search (API keys, search
            tokens, members). Default true for text, long_text, rich_text and
            enum.
        filterable:
          type: boolean
          description: API searches can filter on it. Default false.
        sortable:
          type: boolean
          description: API searches can sort on it (one value only). Default false.
        min_length:
          type: integer
          minimum: 0
        max_length:
          type: integer
          minimum: 0
    RichTextFieldConfiguration:
      type: object
      additionalProperties: false
      description: >-
        A rich text document up to 1,000,000 bytes (`too_large`), written as
        Markdown or a document (see `RecordData`).
      properties:
        description:
          type: string
          maxLength: 500
          description: Help text for editors.
        searchable:
          type: boolean
          description: >-
            Search words match the field, in every search (API keys, search
            tokens, members). Default true for text, long_text, rich_text and
            enum.
        filterable:
          type: boolean
          description: API searches can filter on it. Default false.
        sortable:
          type: boolean
          description: API searches can sort on it (one value only). Default false.
    IntegerFieldConfiguration:
      type: object
      additionalProperties: false
      properties:
        description:
          type: string
          maxLength: 500
          description: Help text for editors.
        searchable:
          type: boolean
          description: >-
            Search words match the field, in every search (API keys, search
            tokens, members). Default true for text, long_text, rich_text and
            enum.
        filterable:
          type: boolean
          description: API searches can filter on it. Default false.
        sortable:
          type: boolean
          description: API searches can sort on it (one value only). Default false.
        min:
          type: integer
        max:
          type: integer
        unique:
          type: boolean
          description: >-
            No two active records of the collection share a value (one value
            only).
    DecimalFieldConfiguration:
      type: object
      additionalProperties: false
      properties:
        description:
          type: string
          maxLength: 500
          description: Help text for editors.
        searchable:
          type: boolean
          description: >-
            Search words match the field, in every search (API keys, search
            tokens, members). Default true for text, long_text, rich_text and
            enum.
        filterable:
          type: boolean
          description: API searches can filter on it. Default false.
        sortable:
          type: boolean
          description: API searches can sort on it (one value only). Default false.
        min:
          type: number
        max:
          type: number
    DateFieldConfiguration:
      type: object
      additionalProperties: false
      properties:
        description:
          type: string
          maxLength: 500
          description: Help text for editors.
        searchable:
          type: boolean
          description: >-
            Search words match the field, in every search (API keys, search
            tokens, members). Default true for text, long_text, rich_text and
            enum.
        filterable:
          type: boolean
          description: API searches can filter on it. Default false.
        sortable:
          type: boolean
          description: API searches can sort on it (one value only). Default false.
        include_time:
          type: boolean
          description: >-
            Holds a moment (ISO 8601 with an offset) instead of a calendar date;
            changing it is a field migration.
        time_zone:
          type: string
          description: >-
            An IANA time zone (`Europe/Copenhagen`) moments are returned in;
            changing it never rewrites values.
    BooleanFieldConfiguration:
      type: object
      additionalProperties: false
      properties:
        description:
          type: string
          maxLength: 500
          description: Help text for editors.
        searchable:
          type: boolean
          description: >-
            Search words match the field, in every search (API keys, search
            tokens, members). Default true for text, long_text, rich_text and
            enum.
        filterable:
          type: boolean
          description: API searches can filter on it. Default false.
        sortable:
          type: boolean
          description: API searches can sort on it (one value only). Default false.
    EnumFieldConfiguration:
      type: object
      additionalProperties: false
      required:
        - options
      properties:
        description:
          type: string
          maxLength: 500
          description: Help text for editors.
        searchable:
          type: boolean
          description: >-
            Search words match the field, in every search (API keys, search
            tokens, members). Default true for text, long_text, rich_text and
            enum.
        filterable:
          type: boolean
          description: API searches can filter on it. Default false.
        sortable:
          type: boolean
          description: API searches can sort on it (one value only). Default false.
        options:
          type: array
          minItems: 1
          maxItems: 500
          uniqueItems: true
          items:
            type: string
            minLength: 1
            maxLength: 100
    AssetFieldConfiguration:
      type: object
      additionalProperties: false
      properties:
        description:
          type: string
          maxLength: 500
          description: Help text for editors.
        searchable:
          type: boolean
          description: >-
            Search words match the field, in every search (API keys, search
            tokens, members). Default true for text, long_text, rich_text and
            enum.
        filterable:
          type: boolean
          description: API searches can filter on it. Default false.
        sortable:
          type: boolean
          description: API searches can sort on it (one value only). Default false.
        accepted_types:
          type: array
          maxItems: 50
          description: >-
            MIME types or `type/*` wildcards newly written values must have
            (`["image/*", "application/pdf"]`); any file when absent.
          items:
            type: string
    RelationFieldConfiguration:
      type: object
      additionalProperties: false
      required:
        - target_collection_id
      properties:
        description:
          type: string
          maxLength: 500
          description: Help text for editors.
        searchable:
          type: boolean
          description: >-
            Search words match the field, in every search (API keys, search
            tokens, members). Default true for text, long_text, rich_text and
            enum.
        filterable:
          type: boolean
          description: API searches can filter on it. Default false.
        sortable:
          type: boolean
          description: API searches can sort on it (one value only). Default false.
        target_collection_id:
          type: string
          description: The collection (same project) whose records it points at.
    JsonFieldConfiguration:
      type: object
      additionalProperties: false
      description: >-
        Any JSON value up to 100,000 bytes (`too_large`), nested at most 32
        levels deep (`too_deep`): for data with a shape of its own, such as
        settings or another service's payload. Content belongs in typed fields,
        and large data in an asset.
      properties:
        description:
          type: string
          maxLength: 500
          description: Help text for editors.
        searchable:
          type: boolean
          description: >-
            Search words match the field, in every search (API keys, search
            tokens, members). Default true for text, long_text, rich_text and
            enum.
        filterable:
          type: boolean
          description: API searches can filter on it. Default false.
        sortable:
          type: boolean
          description: API searches can sort on it (one value only). Default false.
    WebhookSubscription:
      anyOf:
        - $ref: '#/components/schemas/WebhookEventType'
        - type: string
          enum:
            - record.*
            - draft.*
            - collection.*
            - field.*
            - asset.*
            - '*'
  responses:
    BadRequest:
      description: >-
        The request was malformed: unparseable JSON, an invalid query parameter,
        or a body key the operation doesn't take (detail code
        `unknown_parameter`, naming the key).
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Authentication is missing or invalid.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: The caller is not allowed to perform this action.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: The resource does not exist or is not visible to the caller.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    RateLimited:
      description: >
        Too many requests for this API key or user (or, with failing

        credentials, this IP address). A published-only key is counted per

        client IP. Wait `Retry-After` seconds; retries with the same
        `Idempotency-Key`

        are safe. On the Free plan, an organization's API keys are also

        refused once its API requests reach the month's limit, with a

        `plan_limit` detail (`field` `api_requests`, `usage` and `limit`),

        until the next month (UTC) or an upgrade.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
        RateLimit-Limit:
          $ref: '#/components/headers/RateLimitLimit'
        RateLimit-Remaining:
          $ref: '#/components/headers/RateLimitRemaining'
        RateLimit-Reset:
          $ref: '#/components/headers/RateLimitReset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  headers:
    RequestId:
      description: Unique identifier for the request, also echoed in error bodies.
      schema:
        $ref: '#/components/schemas/RequestId'
    RateLimitLimit:
      description: >-
        Requests allowed in the current window. Sent on every authenticated
        response.
      schema:
        type: integer
    RateLimitRemaining:
      description: Requests left in the current window.
      schema:
        type: integer
    RateLimitReset:
      description: Seconds until the window resets.
      schema:
        type: integer
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: |
        Project-scoped API key, e.g. `nohead_sk_k7fz0a9c3m2q_<secret>`, or
        `nohead_pk_…` for a published-only key. Used by servers, CI, the CLI
        and coding agents.

````

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