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

# Record Customer Consents

> ### Record Customer Consents

Creates an immutable consent record for each consent decision in the request.
Captures IP address and user-agent at the time of recording for evidentiary purposes.

Consent records are append-only — each call adds new records; existing records
are never modified. Use GET to retrieve the current state per consent type.

**Path Parameters**:
- `programId`: UUID of the loyalty program (merchant)
- `customerId`: UUID of the customer

**Request Body**:
- `consents`: List of consent decisions (`consentType`, `granted`, `method`)
- `policyVersion`: Version of the policy document accepted

**Returns**:
- 201 Created with the list of newly created consent records.



## OpenAPI

````yaml https://api.loyalty.dog/openapi.json post /v2/loyalty/programs/{programId}/customers/{customerId}/consents
openapi: 3.1.0
info:
  title: LoyaltyDog
  description: >-

    Welcome to the LoyaltyDog API! This API provides access to our loyalty
    program features, allowing you to integrate with various platforms and
    manage your loyalty data.


    Want to query LoyaltyDog via an AI assistant (Claude, Cursor, Windsurf)? See
    the [MCP Integration guide](https://loyaltydog.ai/playground#mcp).
        
  termsOfService: https://loyalty.dog/loyalty-program-terms-service
  contact:
    name: LoyaltyDog Support
    url: https://loyalty.dog/contact-us
    email: support@loyalty.dog
  version: 1.0.1
servers:
  - url: https://api.loyalty.dog
    description: Production
security:
  - bearerAuth: []
paths:
  /v2/loyalty/programs/{programId}/customers/{customerId}/consents:
    post:
      tags:
        - Loyalty
      summary: Record Customer Consents
      description: >-
        ### Record Customer Consents


        Creates an immutable consent record for each consent decision in the
        request.

        Captures IP address and user-agent at the time of recording for
        evidentiary purposes.


        Consent records are append-only — each call adds new records; existing
        records

        are never modified. Use GET to retrieve the current state per consent
        type.


        **Path Parameters**:

        - `programId`: UUID of the loyalty program (merchant)

        - `customerId`: UUID of the customer


        **Request Body**:

        - `consents`: List of consent decisions (`consentType`, `granted`,
        `method`)

        - `policyVersion`: Version of the policy document accepted


        **Returns**:

        - 201 Created with the list of newly created consent records.
      operationId: >-
        record_customer_consents_v2_loyalty_programs__programId__customers__customerId__consents_post
      parameters:
        - name: programId
          in: path
          required: true
          schema:
            anyOf:
              - $ref: '#/components/schemas/PydanticObjectId'
              - type: string
            title: Programid
        - name: customerId
          in: path
          required: true
          schema:
            anyOf:
              - $ref: '#/components/schemas/PydanticObjectId'
              - type: string
            title: Customerid
        - name: authorization
          in: header
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Authorization
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RecordConsentsPayload'
      responses:
        '201':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
components:
  schemas:
    PydanticObjectId:
      type: string
      maxLength: 24
      minLength: 24
      pattern: ^[0-9a-f]{24}$
      example: 5eb7cf5a86d9755df3a6c593
    RecordConsentsPayload:
      properties:
        consents:
          items:
            $ref: '#/components/schemas/ConsentInput'
          type: array
          minItems: 1
          title: Consents
        policyVersion:
          type: string
          minLength: 1
          title: Policyversion
      type: object
      required:
        - consents
        - policyVersion
      title: RecordConsentsPayload
      description: |-
        Request body for POST /customers/{id}/consents.

        Attributes:
            consents: One or more consent decisions to record.
            policyVersion: Version of the policy document the customer is consenting to.
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ConsentInput:
      properties:
        consentType:
          $ref: '#/components/schemas/ConsentType'
        granted:
          type: boolean
          title: Granted
        method:
          $ref: '#/components/schemas/ConsentMethod'
      type: object
      required:
        - consentType
        - granted
        - method
      title: ConsentInput
      description: A single consent decision for one consent type.
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
    ConsentType:
      type: string
      enum:
        - marketing_email
        - marketing_sms
        - analytics
        - data_sharing
      title: ConsentType
    ConsentMethod:
      type: string
      enum:
        - checkbox
        - api
        - paper
        - verbal
        - pos_terminal
        - migration
      title: ConsentMethod
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: JWT access token obtained from POST /v2/token.

````