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

# Record Terms Presentation

> Record an in-app presentation assertion separately from acceptance

> [!NOTE]
>
> Available in the Platform production API from October 22, 2026, including
> migration 119. Mobile distribution and genuine customer acceptance evidence
> remain separate from API availability.

Call only after the current document or notice has been visibly rendered to
the authenticated user. This records a mediated in-app presentation assertion;
it proves neither email delivery nor reading and never records acceptance.

Use a secret project key, a restricted key with `end_users:write`, or the same
EndUser's token. Resolve the exact active EndUser in the authenticated project
on your trusted server. Device, upload and completion credentials are refused.

Copy `version` and `content_sha256` from the
[current document](/api-reference/end-users/terms.md) that was displayed. Use
`channel: "api"` for your API integration; the trusted Bota One proxy supplies
`bota_one`. The public EndUser route does not accept `portal`.

The body accepts only those three fields. Do not send a subject, timestamp or
backdated presentation. The server supplies `presented_at`.

Retries return the original notice for the same subject, version and channel.
A generic `Idempotency-Key` header is unnecessary: every retry performs fresh
subject and document checks. A stale version or hash returns `409`; read and
display the current document before submitting a new presentation assertion.

[Acceptance](/api-reference/end-users/terms-acceptance.md) is a separate explicit
action. This endpoint sends no email and activates no changed processing.


## OpenAPI

````yaml POST /end-users/{id}/terms/notices
openapi: 3.1.0
info:
  title: Bota API
  description: >-
    API for capturing, ingesting, and processing offline conversations via AI
    wearable devices
  version: 1.0.0
  contact:
    name: Bota Support
    email: support@bota.dev
servers:
  - url: https://api.bota.dev/v1
    description: Production
security:
  - bearerAuth: []
tags:
  - name: End Users
    description: Manage end users (wearable device users)
  - name: Devices
    description: Register, configure, and manage devices
  - name: Recordings
    description: Create and manage audio recordings
  - name: Uploads
    description: Upload and download recording audio files
  - name: Transcriptions
    description: Create and retrieve transcriptions
  - name: Summaries
    description: Create and retrieve AI-generated summaries
  - name: Search
    description: Semantic search over transcript chunks (RAG retrieval)
  - name: AI Ask
    description: Multi-turn Q&A over recordings (single- and cross-recording)
paths:
  /end-users/{id}/terms/notices:
    post:
      tags:
        - End Users
      summary: Record In-App Terms Presentation
      description: >-
        Call only after actual in-app presentation. This is a mediated client
        assertion, not email delivery or proof of reading. Requires
        end_users:write or the same EndUser token; immutable, server-timestamped
        and retry-safe. No subject or time may be supplied.
      operationId: postEndUsersByIdTermsNotices
      parameters:
        - schema:
            type: string
          required: true
          name: id
          in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                version:
                  type: string
                  minLength: 1
                  maxLength: 64
                content_sha256:
                  type: string
                  pattern: ^[a-f0-9]{64}$
                channel:
                  type: string
                  enum:
                    - bota_one
                    - api
              required:
                - version
                - content_sha256
                - channel
              additionalProperties: false
      responses:
        '200':
          description: Original presentation receipt
          content:
            application/json:
              schema:
                type: object
                properties:
                  notice:
                    $ref: '#/components/schemas/TermsPresentationReceipt'
                required:
                  - notice
        '404':
          description: Not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: Stale version or content hash
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '423':
          $ref: '#/components/responses/OrganizationAccessQuarantined'
components:
  schemas:
    TermsPresentationReceipt:
      type: object
      properties:
        id:
          type: string
          format: uuid
        version:
          type: string
        content_sha256:
          type: string
        presented_at:
          type: string
          format: date-time
        channel:
          type: string
          enum:
            - portal
            - bota_one
            - api
      required:
        - id
        - version
        - content_sha256
        - presented_at
        - channel
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
            message:
              type: string
          required:
            - code
            - message
      required:
        - error
  responses:
    OrganizationAccessQuarantined:
      description: >-
        Organization access is temporarily locked while an organization deletion
        request is active. The organization owner may cancel the request through
        the dashboard during the grace period.
      headers:
        Cache-Control:
          description: Quarantine responses must not be cached.
          schema:
            type: string
            const: no-store
      content:
        application/json:
          schema:
            type: object
            additionalProperties: false
            required:
              - error
            properties:
              error:
                type: object
                additionalProperties: false
                required:
                  - code
                  - message
                properties:
                  code:
                    type: string
                    const: organization_access_quarantined
                  message:
                    type: string
                    const: Organization access is temporarily locked
                  request_id:
                    type: string
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        API key (sk_live_*, sk_test_*, rk_*), device token (dtok_*), or
        command-bound reset completion credential (rct_*; exact factory-reset
        ACK only)

````

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