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

# Create consent

> Records a consent for a site you own. **API key** requests consume one unit of the monthly API quota.




## OpenAPI

````yaml /openapi.yaml post /consents
openapi: 3.0.0
info:
  title: ConsentFly
  version: 1.1.0
  description: >
    API REST do ConsentFly para gerenciar consentimentos e evidências de
    privacidade em escala. Autentique cada chamada com `Authorization: Bearer
    sk-...` (API Key). Cada requisição bem-sucedida consome **1 unidade** da
    cota mensal do plano. Gere sua API Key em `/dashboard/api-keys`.
  contact: {}
servers:
  - url: https://www.consentfly.com.br/api/v1
    description: Produção
security:
  - ApiKeyAuth: []
tags:
  - name: Consents
    description: Capturar, listar, atualizar e auditar registros de consentimento.
  - name: DSAR
    description: >-
      Direito ao esquecimento por titular e recibo canônico para evidência
      regulatória.
  - name: Exports
    description: >-
      Exportação CSV em streaming síncrono ou via job assíncrono para volumes
      grandes.
paths:
  /consents:
    post:
      tags:
        - Consents
      summary: Create consent
      description: >
        Records a consent for a site you own. **API key** requests consume one
        unit of the monthly API quota.
      requestBody:
        required: true
        description: Consent payload
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/consents.CreateConsentRequest'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/consents.ConsentDTO'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/QuotaExceeded'
        '500':
          $ref: '#/components/responses/InternalError'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    consents.CreateConsentRequest:
      type: object
      description: Corpo para criar um consentimento via API server-to-server.
      required:
        - site_id
      properties:
        site_id:
          type: string
          format: uuid
          description: UUID do site (obtido em `/dashboard/sites`).
          example: 6b8b4567-327a-4d10-92a5-9e8c4f5a7d12
        subject_id:
          type: string
          description: Identificador opaco do titular (recomendado hash SHA-256).
          example: user_sha256_a1b2c3d4e5f6
        consent_id:
          type: string
          description: Identificador semântico opcional fornecido pelo cliente.
          example: analytics-2026-05
        accepted:
          type: boolean
          description: Aceite do titular.
          example: true
        preferences:
          type: object
          additionalProperties:
            type: boolean
          description: Preferências por categoria de cookies.
          example:
            analytics: true
            marketing: false
            functional: true
        policy_version:
          type: integer
          description: >-
            Versão da política vigente. Se omitido, usamos a versão ativa do
            site.
          example: 3
        ip_address:
          type: string
          description: IP de origem (usado só para derivar country/region; não persistido).
          example: 200.150.100.50
        user_agent:
          type: string
          description: User-agent do titular.
          example: Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4) AppleWebKit/605.1.15
    consents.ConsentDTO:
      type: object
      description: Registro de consentimento auditável do ConsentFly.
      properties:
        id:
          type: string
          description: Identificador único do consentimento (ULID gerado pelo servidor).
          example: 01HK8VV4P9R3T8M2A2YZJ7HQ5Q
        site_id:
          type: string
          format: uuid
          description: UUID do site dono deste consentimento.
          example: 6b8b4567-327a-4d10-92a5-9e8c4f5a7d12
        subject_id:
          type: string
          description: >-
            Identificador opaco do titular (recomendado hash SHA-256 do
            e-mail/ID interno).
          example: user_sha256_a1b2c3d4e5f6
        consent_id:
          type: string
          description: >-
            Identificador semântico opcional fornecido pelo cliente (ex.
            `analytics-2026-05`).
          example: analytics-2026-05
        accepted:
          type: boolean
          description: '`true` se o titular aceitou, `false` se recusou.'
          example: true
        preferences:
          type: object
          additionalProperties:
            type: boolean
          description: Mapa de categorias de cookies (chave → aceito/recusado).
          example:
            analytics: true
            marketing: false
            functional: true
        policy_version:
          type: integer
          description: >-
            Versão da política de privacidade vigente no momento do
            consentimento.
          example: 3
        country:
          type: string
          description: País ISO 3166-1 alpha-2 derivado do IP. Não persistimos o IP bruto.
          example: BR
        region:
          type: string
          description: Região/UF derivada do IP (granularidade administrativa).
          example: SP
        user_agent:
          type: string
          description: User-agent do navegador do titular no momento da captura.
          example: Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4) AppleWebKit/605.1.15
        created_at:
          type: string
          format: date-time
          description: Timestamp ISO 8601 UTC da criação.
          example: '2026-05-24T10:30:00Z'
        updated_at:
          type: string
          format: date-time
          description: Timestamp ISO 8601 UTC da última alteração.
          example: '2026-05-24T10:30:00Z'
        deleted_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Preenchido em soft-delete (LGPD direito ao esquecimento); `null`
            quando ativo.
          example: null
    utils.APIErrorResponse:
      type: object
      description: Envelope JSON padrão de erro da API.
      properties:
        error:
          type: string
          description: >-
            Código legível por máquina (ex. `unauthorized`, `quota_exceeded`,
            `plan_required`).
          example: unauthorized
        message:
          type: string
          description: Mensagem legível por humano. Para 5xx é genérica.
          example: Invalid or missing API key
  responses:
    BadRequest:
      description: Bad Request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/utils.APIErrorResponse'
    Unauthorized:
      description: Unauthorized
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/utils.APIErrorResponse'
    PaymentRequired:
      description: Plan inactive (payment required)
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/utils.APIErrorResponse'
    Forbidden:
      description: Forbidden (feature gate or plan limit)
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/utils.APIErrorResponse'
    QuotaExceeded:
      description: Monthly API quota exhausted
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/utils.APIErrorResponse'
    InternalError:
      description: Internal Server Error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/utils.APIErrorResponse'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: |
        Autenticação por API Key no formato `Authorization: Bearer sk-...`
        (sempre inclua o prefixo `Bearer`).

        Gere sua chave em `/dashboard/api-keys` após criar a conta e
        verificar o e-mail. A chave é exibida **uma única vez** no momento
        da criação — armazene em variável de ambiente no seu backend.
        Nunca exponha em código client-side.

````