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

# Carimbar Cartão

> Adicionar um carimbo a um cartão fidelidade

# Carimbar Cartão

Adiciona um carimbo a um cartão fidelidade de um cliente. Se o cartão for completado, a recompensa é automaticamente disponibilizada.

## Comportamento atual

* a rota aceita `X-Idempotency-Key` para retry seguro
* o `card_id` esperado aqui é o `user_loyalty_progress.id` retornado por `GET /api/v1/public/loyalty-cards`
* a resposta atual retorna o shape de `PublicLoyaltyCardResponse`

## Path Parameters

<ParamField path="card_id" type="string" required>
  ID do progresso retornado por `GET /api/v1/public/loyalty-cards`
</ParamField>

## Body Parameters

<ParamField body="client_id" type="string" required>
  ID do cliente dono do cartão (UUID)
</ParamField>

## Request

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://api.indiqai.com/api/v1/public/loyalty-cards/progress_001/stamp" \
    -H "X-API-Key: indiqai_sua_chave_aqui" \
    -H "X-Idempotency-Key: loyalty-pdv-2026-05-12-001" \
    -H "Content-Type: application/json" \
    -d '{
      "client_id": "550e8400-e29b-41d4-a716-446655440000"
    }'
  ```

  ```typescript JavaScript theme={null}
  const cardId = 'progress_001';

  const response = await fetch(
    `https://api.indiqai.com/api/v1/public/loyalty-cards/${cardId}/stamp`,
    {
      method: 'POST',
      headers: {
        'X-API-Key': 'indiqai_sua_chave_aqui',
        'X-Idempotency-Key': 'loyalty-pdv-2026-05-12-001',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        client_id: '550e8400-e29b-41d4-a716-446655440000'
      })
    }
  );

  const data = await response.json();
  ```

  ```python Python theme={null}
  import httpx

  card_id = 'progress_001'

  response = httpx.post(
      f'https://api.indiqai.com/api/v1/public/loyalty-cards/{card_id}/stamp',
      headers={
          'X-API-Key': 'indiqai_sua_chave_aqui',
          'X-Idempotency-Key': 'loyalty-pdv-2026-05-12-001',
      },
      json={
          'client_id': '550e8400-e29b-41d4-a716-446655440000'
      }
  )

  data = response.json()
  ```
</CodeGroup>

## Response

<ResponseExample>
  ```json 200 OK theme={null}
  {
    "id": "progress_001",
    "client_id": "550e8400-e29b-41d4-a716-446655440000",
    "stamps": 8,
    "max_stamps": 10,
    "completed": false,
    "created_at": "2026-03-20T14:00:00Z"
  }
  ```

  ```json 200 OK (Replay idempotente) theme={null}
  {
    "id": "progress_001",
    "client_id": "550e8400-e29b-41d4-a716-446655440000",
    "stamps": 8,
    "max_stamps": 10,
    "completed": false,
    "created_at": "2026-03-20T14:00:00Z"
  }
  ```

  ```json 404 Not Found theme={null}
  {
    "detail": "Cartão não encontrado ou não pertence ao cliente/empresa"
  }
  ```
</ResponseExample>

## Campos da Resposta

<ResponseField name="id" type="string">
  ID do progresso de fidelidade
</ResponseField>

<ResponseField name="client_id" type="string">
  ID do cliente dono do progresso
</ResponseField>

<ResponseField name="stamps" type="integer">
  Quantidade atual de carimbos após a operação
</ResponseField>

<ResponseField name="max_stamps" type="integer">
  Total de carimbos necessários
</ResponseField>

<ResponseField name="completed" type="boolean">
  Se o cartão foi completado com este carimbo
</ResponseField>

<ResponseField name="created_at" type="string">
  Data original de criação do progresso
</ResponseField>


## OpenAPI

````yaml POST /api/v1/public/loyalty-cards/{card_id}/stamp
openapi: 3.1.0
info:
  contact:
    email: support@indiqai.com
    name: IndiqAI Support
    url: https://indiqai.com/
  description: Especificação OpenAPI da API Pública IndiqAI.
  license:
    name: Proprietary
    url: https://indiqai.com/license
  title: IndiqAI API Pública
  version: 1.5.0
servers:
  - description: Produção
    url: https://api.indiqai.com
security: []
paths:
  /api/v1/public/loyalty-cards/{card_id}/stamp:
    post:
      tags:
        - API Pública
      summary: Carimbar cartão
      description: >-
        Carimba um cartão de fidelidade (incrementa selo). Suporta
        X-Idempotency-Key.
      operationId: stamp_card_api_v1_public_loyalty_cards__card_id__stamp_post
      parameters:
        - in: path
          name: card_id
          required: true
          schema:
            title: Card Id
            type: string
        - in: header
          name: X-Idempotency-Key
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: X-Idempotency-Key
        - description: Chave de API
          in: header
          name: X-API-Key
          required: true
          schema:
            description: Chave de API
            title: X-Api-Key
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PublicStampRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicLoyaltyCardResponse'
          description: Successful Response
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
          description: Validation Error
components:
  schemas:
    PublicStampRequest:
      description: Carimbar cartão de fidelidade.
      properties:
        client_id:
          description: ID do cliente
          title: Client Id
          type: string
      required:
        - client_id
      title: PublicStampRequest
      type: object
    PublicLoyaltyCardResponse:
      description: Dados de um cartão de fidelidade.
      properties:
        client_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Client Id
        completed:
          default: false
          title: Completed
          type: boolean
        created_at:
          anyOf:
            - format: date-time
              type: string
            - type: 'null'
          title: Created At
        id:
          title: Id
          type: string
        max_stamps:
          default: 0
          title: Max Stamps
          type: integer
        stamps:
          default: 0
          title: Stamps
          type: integer
      required:
        - id
      title: PublicLoyaltyCardResponse
      type: object
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          title: Detail
          type: array
      title: HTTPValidationError
      type: object
    ValidationError:
      properties:
        ctx:
          title: Context
          type: object
        input:
          title: Input
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          title: Location
          type: array
        msg:
          title: Message
          type: string
        type:
          title: Error Type
          type: string
      required:
        - loc
        - msg
        - type
      title: ValidationError
      type: object

````