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

# Listar campañas

> Lista grupos de campañas de atribución first-touch para el workspace vinculado a la key.

**Scopes requeridos:** `analytics.read`


## OpenAPI

````yaml /es/api-reference/openapi.yaml get /api/v1/campaigns
openapi: 3.1.0
info:
  title: RoofKit Partner API
  version: 1.0.0
  summary: API REST JSON para integraciones externas de socios de RoofKit.
  contact:
    name: RoofKit Engineering
  description: >-
    RoofKit Partner API v1 autentica solicitudes con API keys del workspace. Las
    API keys vinculan cada solicitud exactamente a un workspace; las rutas de
    Partner API no aceptan roofer_id, workspace_id ni identificadores de tenant.
    Los endpoints autenticados están limitados a 60 solicitudes por minuto por
    API key, método y plantilla de ruta; los intentos de autenticación inválidos
    se limitan por separado a 20 solicitudes por minuto por cliente y endpoint.
    Los parámetros y campos de fecha/hora aceptan ISO 8601 con Z o un desfase
    ±HH:MM, por ejemplo 2026-09-07T04:00:00Z o 2026-09-07T00:00:00-04:00. Ambos
    indican el mismo instante y devuelven el mismo resultado. Codifica + como
    %2B en una query string. Las respuestas usan UTC.


    Una fecha/hora sin desfase, por ejemplo 2026-09-07T04:00:00, está obsoleta.
    Hasta la fecha de retiro, 2027-01-10T00:00:00Z, se interpreta como UTC, y la
    respuesta incluye un header `Deprecation` (RFC 9745) y un header `Sunset`
    (RFC 8594). A partir de la fecha de retiro, se requiere Z o un desfase
    ±HH:MM. Desde entonces, una fecha/hora sin desfase devuelve 400 con el
    código `VALIDATION_ERROR`, y la respuesta no incluye ningún header
    `Deprecation` ni `Sunset`.


    Cada API key tiene solo los scopes que un propietario o administrador del
    workspace eligió al crear la key, y sus scopes nunca cambian. Cada operación
    indica los scopes que requiere en `x-required-scopes`. Una key nueva en
    Configuración empieza con el nivel predefinido Solo lectura: `leads.read`,
    `analytics.read`, `reports.read` y `data_objects.read`. Una key de Solo
    lectura puede llamar a todas las operaciones de lectura excepto las
    exportaciones, las lecturas de Sales Visualizer y los Data Objects en
    papelera, y no puede llamar a ninguna operación de escritura. Una llamada
    que necesita un scope que la key no tiene devuelve 403 `FORBIDDEN`, y
    `error.details.required_scope` indica un scope faltante.
servers:
  - url: https://api.roofkit.ai
    description: Origen canónico de RoofKit Partner API
security:
  - ApiKeyBearer: []
tags:
  - name: Foundation
    description: Endpoints base de autenticación y contrato.
  - name: Leads
    description: Endpoints de sincronización de leads para CRM de socios.
  - name: Attribution
    description: >-
      Endpoints de atribución de marketing, analíticas de campañas e ingesta de
      eventos para socios.
  - name: Pipeline
    description: Metadatos del pipeline de leads legibles para socios.
  - name: Reports
    description: >-
      Endpoints para importar, listar, obtener, exportar y descargar reportes de
      socios.
  - name: Visualizer
    description: >-
      Endpoints de Partner para crear Sales Visualizer, generar visualizaciones,
      crear enlaces alojados de subida de fotos, leer imágenes, consultar el
      historial de sesión y crear enlaces compartidos.
  - name: Estimates
    description: >-
      Creación y lectura de Budget Estimates de Partner para el workspace
      vinculado a la key.
  - name: Objects
    description: >-
      Endpoints de Partner para descubrimiento, esquema, registros, relaciones,
      vistas y administración de Data Objects.
paths:
  /api/v1/campaigns:
    get:
      tags:
        - Attribution
      summary: Listar campañas
      description: >-
        Lista grupos de campañas de atribución first-touch para el workspace
        vinculado a la key.
      operationId: List campaigns
      parameters:
        - $ref: '#/components/parameters/AttributionFrom'
        - $ref: '#/components/parameters/AttributionTo'
        - $ref: '#/components/parameters/AttributionTimezone'
      responses:
        '200':
          description: Filas de atribución por campaña.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CampaignsResponse'
        '400':
          $ref: '#/components/responses/AttributionValidationError'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  parameters:
    AttributionFrom:
      name: from
      in: query
      description: >-
        Límite inferior inclusivo. Fecha/hora ISO 8601 con Z o un desfase
        ±HH:MM. Codifica + como %2B. Por defecto es 30 días antes de `to` o
        ahora.
      schema:
        type: string
        format: date-time
    AttributionTo:
      name: to
      in: query
      description: >-
        Límite superior exclusivo. Fecha/hora ISO 8601 con Z o un desfase
        ±HH:MM. Codifica + como %2B. Por defecto es la hora actual del servidor.
      schema:
        type: string
        format: date-time
    AttributionTimezone:
      name: timezone
      in: query
      description: Zona horaria IANA usada para límites de analíticas y prorrateo de gasto.
      schema:
        type: string
        default: UTC
        maxLength: 100
  headers:
    Deprecation:
      description: >-
        Presente solo cuando la solicitud envió una fecha/hora sin desfase
        respecto a UTC. Esa forma está obsoleta y se interpretó como UTC. El
        valor es la fecha de obsolescencia de RFC 9745 como `@` seguido de los
        segundos Unix.
      schema:
        type: string
        example: '@1791763200'
    Sunset:
      description: >-
        Presente solo con Deprecation. La HTTP-date de RFC 8594 a partir de la
        cual una fecha/hora sin desfase respecto a UTC devuelve 400.
      schema:
        type: string
        example: Sun, 10 Jan 2027 00:00:00 GMT
    RateLimitLimit:
      description: Cantidad máxima de solicitudes permitidas en la ventana actual.
      schema:
        type: string
    RateLimitRemaining:
      description: Solicitudes restantes en la ventana actual.
      schema:
        type: string
    RateLimitReset:
      description: Timestamp ISO cuando se reinicia la ventana actual de rate limit.
      schema:
        type: string
        format: date-time
    RetryAfter:
      description: Segundos hasta que el llamador debería reintentar.
      schema:
        type: string
  schemas:
    CampaignsResponse:
      type: object
      additionalProperties: false
      required:
        - campaigns
        - summary
        - range
      properties:
        campaigns:
          type: array
          items:
            $ref: '#/components/schemas/AttributionRow'
        summary:
          $ref: '#/components/schemas/AttributionMetrics'
        range:
          $ref: '#/components/schemas/AttributionRange'
        restricted:
          $ref: '#/components/schemas/AttributionFinancialRestriction'
    AttributionRow:
      type: object
      additionalProperties: false
      required:
        - id
        - key
        - label
        - source
        - medium
        - campaign
        - metrics
      properties:
        id:
          type: string
        key:
          type: string
        label:
          type: string
        source:
          type:
            - string
            - 'null'
        medium:
          type:
            - string
            - 'null'
        campaign:
          type:
            - string
            - 'null'
        metrics:
          $ref: '#/components/schemas/AttributionMetrics'
    AttributionMetrics:
      type: object
      additionalProperties: false
      required:
        - lead_count
        - conversion_count
        - conversion_rate
        - avg_lead_to_sold_seconds
        - funnel_gap_count
        - funnel_gap_rate
        - stage_counts
        - stages
        - trend
        - trends
        - automated_spend_cents
        - other_costs_cents
        - total_spend_cents
        - prorated_spend_cents
        - cpl_cents
        - cpa_cents
        - revenue_cents
        - roas
        - currency
        - form_count
        - call_count
        - answered_call_count
        - missed_call_count
        - avg_call_duration_seconds
        - call_duration_seconds_total
        - sms_inbound_count
        - sms_outbound_count
        - sms_inbound_thread_count
        - sms_responded_thread_count
        - sms_response_rate
      properties:
        lead_count:
          type: integer
        conversion_count:
          type: integer
        conversion_rate:
          type: number
        avg_lead_to_sold_seconds:
          type:
            - number
            - 'null'
        funnel_gap_count:
          type: integer
        funnel_gap_rate:
          type: number
        funnel_gap_stage_counts:
          type: object
          additionalProperties:
            type: integer
        stage_counts:
          description: >-
            Leads en cada estado de Contacts, por id de estado. Un workspace que
            importa su CRM guarda la etapa del negocio en Opportunities, así que
            lee opportunities para ese embudo.
          type: object
          additionalProperties:
            type: integer
        stages:
          type: array
          items:
            type: object
            additionalProperties: true
        trend:
          type: object
          additionalProperties: true
        trends:
          type: object
          additionalProperties: true
        automated_spend_cents:
          type:
            - integer
            - 'null'
        other_costs_cents:
          type:
            - integer
            - 'null'
        total_spend_cents:
          type:
            - integer
            - 'null'
        prorated_spend_cents:
          type:
            - integer
            - 'null'
        cpl_cents:
          type:
            - integer
            - 'null'
        cpa_cents:
          type:
            - integer
            - 'null'
        revenue_cents:
          description: >-
            Valor de ventas aprobado en el rango, en centavos, por la fuente
            first-touch del Contact vinculado a cada Opportunity. Solo los
            endpoints de fuentes de leads lo completan. Es null en los endpoints
            de campañas y sin acceso financiero.
          type:
            - integer
            - 'null'
        roas:
          description: >-
            revenue_cents dividido por prorated_spend_cents, redondeado a dos
            decimales. Es null sin gasto, en los endpoints de campañas y sin
            acceso financiero.
          type:
            - number
            - 'null'
        opportunities:
          $ref: '#/components/schemas/AttributionOpportunityMetrics'
        currency:
          type:
            - string
            - 'null'
        form_count:
          type: integer
        call_count:
          type: integer
        answered_call_count:
          type: integer
        missed_call_count:
          type: integer
        avg_call_duration_seconds:
          type:
            - number
            - 'null'
        call_duration_seconds_total:
          type: integer
        sms_inbound_count:
          type: integer
        sms_outbound_count:
          type: integer
        sms_inbound_thread_count:
          type: integer
        sms_responded_thread_count:
          type: integer
        sms_response_rate:
          type: number
    AttributionRange:
      type: object
      additionalProperties: false
      required:
        - from
        - to
        - timezone
      properties:
        from:
          type: string
          format: date-time
        to:
          type: string
          format: date-time
        timezone:
          type: string
    AttributionFinancialRestriction:
      type: string
      enum:
        - financial
      description: >-
        Presente cuando el miembro detrás de la API key no tiene acceso
        financiero. En ese caso, el gasto, el costo por lead, el costo por
        adquisición, los ingresos y el ROAS son null.
    ErrorResponse:
      type: object
      additionalProperties: false
      required:
        - error
      properties:
        error:
          type: object
          additionalProperties: false
          required:
            - code
            - message
            - request_id
          properties:
            code:
              $ref: '#/components/schemas/ErrorCode'
            message:
              type: string
            request_id:
              type: string
            details:
              type: object
              additionalProperties: true
    AttributionOpportunityMetrics:
      type: object
      additionalProperties: false
      description: >-
        Cifras de Opportunities de la tabla Sources del Overview, por la fuente
        first-touch del Contact vinculado a cada Opportunity. Solo los endpoints
        de fuentes de leads las devuelven. Las cifras cuentan días calendario
        completos en timezone. Una cifra es null cuando RoofKit no pudo leerla
        completa para el rango.
      required:
        - created_count
        - appointment_count
        - won_count
      properties:
        created_count:
          description: Opportunities creadas en el rango.
          type:
            - integer
            - 'null'
        appointment_count:
          description: Opportunities que entraron en la etapa Appointment en el rango.
          type:
            - integer
            - 'null'
        won_count:
          description: Opportunities que entraron en la etapa Won en el rango.
          type:
            - integer
            - 'null'
    ErrorCode:
      type: string
      enum:
        - UNAUTHORIZED
        - FORBIDDEN
        - RATE_LIMITED
        - VALIDATION_ERROR
        - NOT_FOUND
        - CONFLICT
        - INSUFFICIENT_CREDITS
        - INTERNAL_ERROR
  responses:
    AttributionValidationError:
      description: >-
        La query no es válida, o el rango tiene demasiados leads para una
        solicitud. Un rango por encima del límite de búsqueda devuelve
        `details.reason` con el valor `range_too_large`, junto con `lead_count`
        y `suggested_max_days`. `suggested_max_days` es la mayor cantidad de
        días completos que cabe cuando `to` se mantiene igual, o null cuando un
        solo día ya supera el límite.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            range_too_large:
              summary: El rango tiene demasiados leads para una solicitud
              value:
                error:
                  code: VALIDATION_ERROR
                  message: >-
                    The date range contains too many leads for one request. With
                    the same to, request 45 days or fewer.
                  request_id: req_123
                  details:
                    reason: range_too_large
                    lead_count: 2800
                    suggested_max_days: 45
    Unauthorized:
      description: API key ausente, malformada, revocada, eliminada o desconocida.
      headers:
        WWW-Authenticate:
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Forbidden:
      description: >-
        La API key no tiene un scope requerido, o el workspace no está activo.
        Un fallo de scope indica un scope faltante en `details.required_scope`.
        Cuando la búsqueda de la key rechaza la llamada,
        `details.missing_scopes` lista cada scope requerido que la key no tiene.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            missing_scope:
              summary: Una key de Solo lectura llama a una operación de escritura
              value:
                error:
                  code: FORBIDDEN
                  message: 'API key does not include the required scope: leads.write.'
                  request_id: req_123
                  details:
                    required_scope: leads.write
                    missing_scopes:
                      - leads.write
    RateLimited:
      description: >-
        Rate limit excedido para esta key y endpoint o para el bucket de
        autenticación inválida.
      headers:
        X-RateLimit-Limit:
          $ref: '#/components/headers/RateLimitLimit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/RateLimitRemaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/RateLimitReset'
        Retry-After:
          $ref: '#/components/headers/RetryAfter'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    InternalError:
      description: Error interno de autenticación o del servidor.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  securitySchemes:
    ApiKeyBearer:
      type: http
      scheme: bearer
      bearerFormat: RoofKit API key
      description: 'Usa `Authorization: Bearer rk_live_...`.'

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.