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

# Request clickwrap re-acceptance

> Marks one or more end users' prior clickwrap acceptances as stale so the SDK
re-displays the clickwrap on their next `GET /clickwrap`, prompting them to
sign again against the current template content and placeholder values.

Typically called from your backend's profile-update handler when details
that were filled into the agreement change (such as the user's name, address,
or company). ClickTerm does **not** detect these changes for you - you decide
when a re-acceptance is needed.

The set of pairs evaluated is the **cartesian product** of `endUserIds` ×
`clickwrapTemplateIds`. Each pair is evaluated independently and produces
exactly one entry in `results`.

The user's previous acceptance event remains valid and binding - it is never
invalidated, so there is no compliance gap. The consent status endpoint keeps
reporting `status: ACCEPTED` based on that event; the new `reAcceptanceRequired`
field is simply an extra signal that the clickwrap should be shown again so the
user can re-accept.

**Authenticated** - requires `X-APP-ID` and `X-APP-KEY` headers. All
resolution is scoped to the calling app.




## OpenAPI

````yaml /openapi/clickterm-public-api.yaml post /clickwraps/re-accept
openapi: 3.0.3
info:
  title: ClickTerm Public Client API
  version: '1.0'
  description: |
    The ClickTerm Public Client API lets you integrate legally-binding
    consent management into your application. Use it alongside the
    ClickTerm Web SDK or Android SDK.

    **Authentication:** Most endpoints require `X-APP-ID` and `X-APP-KEY`
    headers. The exceptions are `GET /clickwrap` and `POST /clickwrap`,
    which use the public `appId` in query/body parameters and do not
    require the App Key.
  contact:
    name: ClickTerm Support
    url: https://clickterm.com
    email: support@clickterm.com
servers:
  - url: https://api.clickterm.com/public-client/v1
    description: Production
security: []
tags:
  - name: Clickwrap
    description: >-
      Core clickwrap operations — fetch templates, record acceptance, verify
      Signatures
  - name: Events
    description: Clickwrap event details, certificates, and consent status
  - name: Templates
    description: Template discovery and metadata
paths:
  /clickwraps/re-accept:
    post:
      tags:
        - Events
      summary: Request clickwrap re-acceptance
      description: >
        Marks one or more end users' prior clickwrap acceptances as stale so the
        SDK

        re-displays the clickwrap on their next `GET /clickwrap`, prompting them
        to

        sign again against the current template content and placeholder values.


        Typically called from your backend's profile-update handler when details

        that were filled into the agreement change (such as the user's name,
        address,

        or company). ClickTerm does **not** detect these changes for you - you
        decide

        when a re-acceptance is needed.


        The set of pairs evaluated is the **cartesian product** of `endUserIds`
        ×

        `clickwrapTemplateIds`. Each pair is evaluated independently and
        produces

        exactly one entry in `results`.


        The user's previous acceptance event remains valid and binding - it is
        never

        invalidated, so there is no compliance gap. The consent status endpoint
        keeps

        reporting `status: ACCEPTED` based on that event; the new
        `reAcceptanceRequired`

        field is simply an extra signal that the clickwrap should be shown again
        so the

        user can re-accept.


        **Authenticated** - requires `X-APP-ID` and `X-APP-KEY` headers. All

        resolution is scoped to the calling app.
      operationId: requestReAcceptance
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ReAcceptRequest'
            example:
              endUserIds:
                - user-123
                - user-456
              clickwrapTemplateIds:
                - 987e6543-e21b-45d3-b321-426614174999
              reason: user_updated_profile
      responses:
        '200':
          description: Per end-user/template-pair re-acceptance outcomes
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReAcceptResponse'
              example:
                results:
                  - endUserId: user-123
                    clickwrapTemplateId: 987e6543-e21b-45d3-b321-426614174999
                    status: re_accept_requested
                  - endUserId: user-456
                    clickwrapTemplateId: 987e6543-e21b-45d3-b321-426614174999
                    status: skipped
                    reason: no_prior_acceptance
                summary:
                  re_accept_requested: 1
                  skipped: 1
        '400':
          description: >-
            Malformed body, empty `endUserIds`, empty `clickwrapTemplateIds`, or
            `reason` longer than 500 characters
        '401':
          description: Invalid App Key or App Id
        '404':
          description: >
            One or more `endUserIds` or `clickwrapTemplateIds` could not be
            resolved

            under the calling app. Fail-fast - no re-acceptance requests are
            created

            and no audit log is written.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReAcceptNotFound'
              example:
                error: resource_not_found
                missingEndUserIds:
                  - user-bogus-99
                missingClickwrapTemplateIds:
                  - 00000000-0000-0000-0000-000000000000
      security:
        - appIdHeader: []
          appKeyHeader: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: >
            curl -X POST
            https://api.clickterm.com/public-client/v1/clickwraps/re-accept \
              -H "X-APP-ID: YOUR_APP_ID" \
              -H "X-APP-KEY: YOUR_APP_KEY" \
              -H "Content-Type: application/json" \
              -d '{
                    "endUserIds": ["user-123", "user-456"],
                    "clickwrapTemplateIds": ["987e6543-e21b-45d3-b321-426614174999"],
                    "reason": "user_updated_profile"
                  }'
        - lang: javascript
          label: Node.js
          source: |
            const response = await fetch(
              "https://api.clickterm.com/public-client/v1/clickwraps/re-accept",
              {
                method: "POST",
                headers: {
                  "X-APP-ID": process.env.CLICKTERM_APP_ID,
                  "X-APP-KEY": process.env.CLICKTERM_APP_KEY,
                  "Content-Type": "application/json",
                },
                body: JSON.stringify({
                  endUserIds: ["user-123", "user-456"],
                  clickwrapTemplateIds: ["987e6543-e21b-45d3-b321-426614174999"],
                  reason: "user_updated_profile",
                }),
              }
            );
            const result = await response.json();
        - lang: python
          label: Python
          source: |
            response = requests.post(
                "https://api.clickterm.com/public-client/v1/clickwraps/re-accept",
                headers={
                    "X-APP-ID": CLICKTERM_APP_ID,
                    "X-APP-KEY": CLICKTERM_APP_KEY,
                    "Content-Type": "application/json",
                },
                json={
                    "endUserIds": ["user-123", "user-456"],
                    "clickwrapTemplateIds": ["987e6543-e21b-45d3-b321-426614174999"],
                    "reason": "user_updated_profile",
                },
            )
            result = response.json()
        - lang: java
          label: Java
          source: |
            HttpResponse<String> response = Unirest.post(
                "https://api.clickterm.com/public-client/v1/clickwraps/re-accept")
              .header("X-APP-ID", "YOUR_APP_ID")
              .header("X-APP-KEY", "YOUR_APP_KEY")
              .header("Content-Type", "application/json")
              .body("{\"endUserIds\":[\"user-123\"],\"clickwrapTemplateIds\":[\"987e6543-e21b-45d3-b321-426614174999\"],\"reason\":\"user_updated_profile\"}")
              .asString();
components:
  schemas:
    ReAcceptRequest:
      type: object
      description: Identifies which end users and templates to mark for re-acceptance
      required:
        - endUserIds
        - clickwrapTemplateIds
      properties:
        endUserIds:
          type: array
          minItems: 1
          items:
            type: string
          description: >
            External end-user identifiers (your own IDs). Each is resolved under
            the

            calling app. Must be non-empty.
        clickwrapTemplateIds:
          type: array
          minItems: 1
          items:
            type: string
            format: uuid
          description: >
            Clickwrap template IDs to mark for re-acceptance. Each is resolved
            under

            the calling app. Must be non-empty.
        reason:
          type: string
          maxLength: 500
          nullable: true
          description: Optional free-text note stored for audit. Max 500 characters.
    ReAcceptResponse:
      type: object
      description: Outcome of a re-acceptance request, one entry per end-user/template pair
      properties:
        results:
          type: array
          description: One entry per `(endUserId, clickwrapTemplateId)` pair
          items:
            $ref: '#/components/schemas/ReAcceptResult'
        summary:
          type: object
          additionalProperties:
            type: integer
          description: >
            Count of pairs by `status` value, e.g. `{ "re_accept_requested": 1,
            "skipped": 2 }`.
    ReAcceptNotFound:
      type: object
      description: Fail-fast response when any end user or template cannot be resolved
      properties:
        error:
          type: string
          example: resource_not_found
          description: Always `resource_not_found`
        missingEndUserIds:
          type: array
          items:
            type: string
          description: >
            End-user identifiers that could not be resolved under the calling
            app.

            Covers both "does not exist" and "belongs to another app" - no
            enumeration

            leak between apps.
        missingClickwrapTemplateIds:
          type: array
          items:
            type: string
            format: uuid
          description: Template IDs that could not be resolved under the calling app
    ReAcceptResult:
      type: object
      description: Re-acceptance outcome for a single end-user/template pair
      properties:
        endUserId:
          type: string
          description: The external end-user identifier for this pair
        clickwrapTemplateId:
          type: string
          format: uuid
          description: The clickwrap template ID for this pair
        status:
          type: string
          enum:
            - re_accept_requested
            - skipped
          description: >
            - `re_accept_requested` - a new re-acceptance request was created;
            the
              user will be re-prompted on their next `GET /clickwrap`.
            - `skipped` - no request was created. See `reason`.
        reason:
          type: string
          nullable: true
          enum:
            - already_re_accept_requested
            - no_prior_acceptance
            - always_on_re_acceptance
          description: >
            Present only when `status` is `skipped`:

            - `already_re_accept_requested` - an unfulfilled re-acceptance
            request
              already exists for this pair.
            - `no_prior_acceptance` - the user has no accepted event for this
            template
              under this app, so there is nothing to re-accept.
            - `always_on_re_acceptance` - the template already has **Always
            require
              re-acceptance** enabled, so an explicit request would be a no-op.
  securitySchemes:
    appIdHeader:
      type: apiKey
      in: header
      name: X-APP-ID
      description: |
        Your application's App ID, sent as the `X-APP-ID` header.
        Must be accompanied by `X-APP-KEY` for authenticated endpoints.
    appKeyHeader:
      type: apiKey
      in: header
      name: X-APP-KEY
      description: Your application's secret App Key (server-side only)

````