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

# Stream site consents (CSV) or fall through to async queue

> With `format=csv`, streams the site's consent rows directly to the response writer in stable created_at-desc order. Memory usage stays O(batch_size) regardless of total row count. Above ~100k rows (or when the caller passes `?async=true`), the handler returns `202 Accepted` with a queued export id instead of streaming inline — poll `GET /exports/{id}` to follow status. Counts as one export against the per-period rate cap (Starter 5 / Pro+ unlimited). The `consent_export` feature flag is enforced server-side.




## OpenAPI

````yaml /openapi.yaml get /sites/{siteId}/consents/export
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:
  /sites/{siteId}/consents/export:
    get:
      tags:
        - Exports
      summary: Stream site consents (CSV) or fall through to async queue
      description: >
        With `format=csv`, streams the site's consent rows directly to the
        response writer in stable created_at-desc order. Memory usage stays
        O(batch_size) regardless of total row count. Above ~100k rows (or when
        the caller passes `?async=true`), the handler returns `202 Accepted`
        with a queued export id instead of streaming inline — poll `GET
        /exports/{id}` to follow status. Counts as one export against the
        per-period rate cap (Starter 5 / Pro+ unlimited). The `consent_export`
        feature flag is enforced server-side.
      parameters:
        - name: siteId
          in: path
          required: true
          description: Site UUID
          schema:
            type: string
        - name: format
          in: query
          description: >-
            Set to `csv` to use the streaming / async path. Other values return
            JSON.
          schema:
            type: string
            enum:
              - csv
              - json
        - name: async
          in: query
          description: >-
            Force the async queue even when the row count is below the
            threshold.
          schema:
            type: boolean
      responses:
        '200':
          description: CSV body (when below threshold and not explicitly async)
          content:
            text/csv:
              schema:
                type: string
                format: binary
        '202':
          description: Queued (async path)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/exports.EnqueueResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/QuotaExceeded'
        '500':
          $ref: '#/components/responses/InternalError'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    exports.EnqueueResponse:
      type: object
      description: Resposta ao enfileirar um export assíncrono.
      properties:
        id:
          type: string
          description: Identificador do job de export. Use para consultar o status.
          example: exp_01HK8WD2QXKB4R7N9F1H3P5T0G
        status:
          type: string
          enum:
            - queued
          description: Status inicial sempre `queued`.
          example: queued
        status_url:
          type: string
          description: URL relativa para consultar o status do job (`GET /exports/{id}`).
          example: /api/v1/exports/exp_01HK8WD2QXKB4R7N9F1H3P5T0G
        message:
          type: string
          description: Mensagem human-readable do enfileiramento.
          example: Export queued; consult status_url for progress.
    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:
    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'
    NotFound:
      description: Not Found (cross-tenant access collapses to 404)
      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.

````