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

> Save an explicit personal acceptance of the displayed version and hash

> [!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.

Submit only after the EndUser explicitly accepts the displayed exact document.
Use the `version` and `content_sha256` returned by
[Get Terms and Acceptance](/api-reference/end-users/terms.md), with the literal
JSON boolean `affirmative: true`. Login, signup, reading, dismissal and continued
use are not acceptance.

Use a secret project key, a restricted key with `end_users:write`, or the same
EndUser's token. Your trusted backend must authenticate its own user and resolve
the active EndUser in the authenticated project. A request-selected ID alone
does not establish ownership. Device, upload and completion credentials are
refused.

Use `channel: "api"` for your API integration; the trusted Bota One proxy
supplies `bota_one`. The route rejects `portal`, unknown fields, a supplied
subject or a caller timestamp. The server supplies the immutable receipt ID,
subject, project and `accepted_at`.

## Retry and evidence

Retries for the same subject and version return the original receipt, including
its original time and channel. Receipt-level idempotency does not require a
generic `Idempotency-Key` header. Every retry rechecks the current subject,
project and document; a stale version or hash returns `409` rather than a
cached success. Read and review the new document before accepting it.

The trusted API client mediates an acceptance assertion. The receipt is not
independent proof that a human clicked, authority to bind an organization,
recording consent, or permission for a new data-use purpose. No historical
acceptance is inferred or backfilled. Retrieve your own
[event history](/api-reference/end-users/terms-events.md) for evidence.


## OpenAPI

````yaml POST /end-users/{id}/terms/acceptances
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/acceptances:
    post:
      tags:
        - End Users
      summary: Record Affirmative Terms Acceptance
      description: >-
        Submit only after the EndUser explicitly accepts the displayed exact
        version. Requires end_users:write or the same EndUser token. A trusted
        API client mediates this assertion; it is not recording consent or
        authority to bind an organization. Retries return the original server
        receipt.
      operationId: postEndUsersByIdTermsAcceptances
      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
                affirmative:
                  type: boolean
                  enum:
                    - true
              required:
                - version
                - content_sha256
                - channel
                - affirmative
              additionalProperties: false
      responses:
        '200':
          description: Original acceptance receipt
          content:
            application/json:
              schema:
                type: object
                properties:
                  acceptance:
                    $ref: '#/components/schemas/TermsAcceptanceReceipt'
                required:
                  - acceptance
        '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:
    TermsAcceptanceReceipt:
      type: object
      properties:
        id:
          type: string
          format: uuid
        version:
          type: string
        content_sha256:
          type: string
        subject_type:
          type: string
          enum:
            - dashboard_user
            - end_user
        subject_id:
          type: string
        project_id:
          type:
            - string
            - 'null'
        accepted_at:
          type: string
          format: date-time
        channel:
          type: string
          enum:
            - portal
            - bota_one
            - api
      required:
        - id
        - version
        - content_sha256
        - subject_type
        - subject_id
        - project_id
        - accepted_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.