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

> ## Agent Instructions
> Bridge exposes three integration surfaces: the REST Integrations API for pushing data into Bridge, webhooks for receiving events from Bridge, and the public Custom Connections endpoint that a tenant's landing page posts to.
> The Integrations API host is https://api-connect-us.bridge.new and every request to it must be authenticated with the x-api-key header. Bridge does not use bearer tokens or OAuth.
> The Custom Connections endpoint is different and the Integrations API rules do not apply to it: it has its own host, it takes no x-api-key and no authentication header of any kind, and it is called from a visitor's browser. It is identified by a workspace id and a capture key together with a reCAPTCHA token. Never tell a reader to authenticate it with an API key, and never tell them to keep its capture key out of frontend code - it is designed to live in the page.
> REST error catalog keys use BRIDGE_<DOMAIN>_<NNNN>, for example BRIDGE_CONVERSATION_0001. Some reviewed legacy handlers return a recognized code plus a symbolic suffix separated by |; preserve the complete received value and use the compatible catalog lookup on /error-codes. Custom Connections uses separate BRIDGE.CAMPAIGN_LEADS.<NAME> identifiers on its own error reference. Never invent an error code or confuse the two integration surfaces.
> This documentation covers the Integrations API, webhooks and Custom Connections only. It does not describe the Bridge web application or its internal APIs.
> Before generating an API request, read the relevant OpenAPI specification or the individual endpoint Markdown page. llms-full.txt collects guides and endpoint descriptions; it does not embed every request and response schema. The REST and Custom Connections contracts are separate.
> Preserve the published host, method, path, operationId, authentication, headers, parameter and field names, types, formats, required and nullable fields, enums, defaults, limits, and response codes. Do not invent identifiers, fields, retry rules, or delivery guarantees. When published sources conflict, identify the conflicting passages and ask Bridge support to confirm the current behavior before relying on it.
> Custom Connections is the current name of the landing-page feature previously documented as Lead Capture. The existing /lead-capture documentation URLs, captureKey field, campaign-leads endpoint, and BRIDGE.CAMPAIGN_LEADS error identifiers are unchanged. This is a naming change, not a change to authentication or the API contract.
> For a complete workflow, start with the task guides: /guides/first-conversation, /guides/send-attachments, /guides/send-template, /guides/agent-outbound, /guides/pagination, /guides/identifiers and /guides/responses. Read the endpoint contract as well as the recipe. Outbound requires an existing Contact, but does not require creating a separate Conversation first.
> forceSend=true permits reuse of an existing active conversation; it does not create a fresh one by ignoring it and it is not idempotency. Recovery of a released recoverable conversation can occur even with false. The LeadScout and Agents outbound routes have different line-selection and controller checks; use /guides/agent-outbound.
> For webhook HMAC, follow /webhooks/verifying-signatures exactly: the Python JSON serialization with sorted keys is signed; X-Bridge-Timestamp is not included in that signature. Do not claim a signed timestamp, raw-body signing, exactly-once delivery or a global event order. Use /webhooks/receive-events for durable acceptance and duplicates.
> A 201 message response, 202 handoff or 202 Custom Connections response is not a provider delivery receipt. Do not invent a polling endpoint from messageId, trackingId or requestId. REST validation parsing must tolerate the compatibility difference explained in /error-codes.
> The documentation is available in English (existing root URLs), Spanish (/es/) and Brazilian Portuguese (/pt-br/). Prefer the reader's language when a localized page exists, but preserve the API's exact field names, enums, routes, authentication and examples. Translations describe the same API; they do not introduce regional API hosts or behaviors.
> For coding-assistant setup, use /connect-your-agent, /es/connect-your-agent or /pt-br/connect-your-agent. The Bridge documentation MCP server reads published documentation and has a separate optional feedback tool. Connecting it does not connect the coding assistant to a customer workspace or authorize live business requests.
> For direct HTTP access without MCP, start at https://docs.bridge.new/llms.txt. It lists every published page in English, Spanish and Brazilian Portuguese. Choose /llms-en.json, /llms-es.json or /llms-pt-br.json for a language-specific index, and /llms-full-en.json, /llms-full-es.json or /llms-full-pt-br.json for collected content. /llms-full.txt contains the combined collection. Fetch the original OpenAPI specification for exact schemas.
> For HTTP page reads, follow the .md URLs from the index or request Accept: text/markdown at the canonical page URL. The MCP virtual filesystem uses .mdx page paths instead; .mdx is not the public HTTP export extension. With Search MCP, set language to en, es or pt-BR explicitly; its default is en.
> For integration capabilities and source-selection rules, read https://docs.bridge.new/skill.md. Documentation access does not authorize business API actions; use the actual user request, workspace, credentials and target identifiers for any live integration.

# Registrar un lead de campaña

> Registra un lead captado por la página de destino de un tenant y pone en cola el primer mensaje saliente de WhatsApp. Un 202 significa que el lead fue aceptado, no que se haya enviado un mensaje.



## OpenAPI

````yaml /es/api-reference/campaign-leads.openapi.yaml post /leadscout/campaign-leads
openapi: 3.1.0
info:
  title: Bridge Campaign Leads API
  description: >-
    Endpoint público para registrar leads captados por la página de destino de
    un tenant. No se requiere una clave de API: quien llama se identifica
    mediante su workspace y su clave de captura junto con un token de reCAPTCHA
    v3.
  version: 1.0.0
servers:
  - url: https://integrations-us.app.bridge.new/api/v1
security: []
paths:
  /leadscout/campaign-leads:
    post:
      tags:
        - Campaign leads
      summary: Registrar un lead de campaña
      description: >-
        Registra un lead captado por la página de destino de un tenant y pone en
        cola el primer mensaje saliente de WhatsApp. Un 202 significa que el
        lead fue aceptado, no que se haya enviado un mensaje.
      operationId: create_campaign_lead_leadscout_campaign_leads_post
      parameters:
        - description: >-
            Obligatorio al llamar desde un navegador. Una solicitud CORS
            preflight no lleva cuerpo, por lo que no se puede resolver el tenant
            ni devolver Access-Control-Allow-Origin a menos que el workspace
            esté en la URL. Las llamadas de servidor a servidor no realizan
            preflight y pueden omitirlo.
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Workspaceid
            description: >-
              Obligatorio al llamar desde un navegador. Una solicitud CORS
              preflight no lleva cuerpo, por lo que no se puede resolver el
              tenant ni devolver Access-Control-Allow-Origin a menos que el
              workspace esté en la URL. Las llamadas de servidor a servidor no
              realizan preflight y pueden omitirlo.
          name: workspaceId
          in: query
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CampaignLeadRequestDto'
        required: true
      responses:
        '202':
          description: >-
            Aceptado y en cola. NO enviado: un servicio separado transmite el
            primer mensaje después.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CampaignLeadAcceptedDto'
        '400':
          description: >-
            Payload mal formado, teléfono no utilizable, consentimiento no
            concedido o brand ausente.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: >-
            Captura deshabilitada, clave de captura incorrecta, captcha
            rechazado u origen no permitido.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: >-
            No se pudo contactar al proveedor de captcha. Es transitorio; es
            seguro reintentar.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Fallo inesperado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
components:
  schemas:
    CampaignLeadRequestDto:
      properties:
        workspaceId:
          type: string
          title: Workspaceid
        captureKey:
          type: string
          title: Capturekey
        cellphone:
          type: string
          title: Cellphone
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
        brandId:
          anyOf:
            - type: string
            - type: 'null'
          title: Brandid
        landingUri:
          type: string
          title: Landinguri
        utm:
          additionalProperties:
            type: string
          type: object
          title: Utm
        consent:
          $ref: '#/components/schemas/ConsentDto'
        recaptchaToken:
          type: string
          title: Recaptchatoken
      type: object
      required:
        - workspaceId
        - captureKey
        - cellphone
        - landingUri
        - consent
        - recaptchaToken
      title: CampaignLeadRequestDto
      description: Contrato de intercambio de `POST api/v1/leadscout/campaign-leads`.
    CampaignLeadAcceptedDto:
      properties:
        requestId:
          type: string
          title: Requestid
          description: >-
            ID de correlación de este envío. Solo está presente cuando se
            acepta; las respuestas de error no lo incluyen.
      type: object
      required:
        - requestId
      title: CampaignLeadAcceptedDto
      description: >-
        Cuerpo de la respuesta `202 Accepted`.


        Tiene un nombre en lugar de ser un simple `dict[str, str]` para que el
        esquema publicado indique cuál es el único campo y para qué sirve, en
        lugar de «un objeto con propiedades de texto».
    ProblemDetailsDto:
      properties:
        type:
          type: string
          title: Type
          description: Código de error estable legible por máquinas.
        title:
          type: string
          title: Title
          description: Resumen breve legible por humanos.
        status:
          type: integer
          title: Status
          description: Código de estado HTTP, repetido en el cuerpo.
        detail:
          anyOf:
            - type: string
            - type: 'null'
          title: Detail
          description: Detalle opcional. Ausente en la mayoría de los rechazos.
      type: object
      required:
        - type
        - title
        - status
      title: ProblemDetailsDto
      description: >-
        Detalles de problema de RFC 9457, tal como los emite el manejador global
        de excepciones.


        El contexto se elimina deliberadamente antes de llegar a quien llama: en
        un endpoint público, un rechazo detallado indica a un atacante qué
        comprobación no superó.
    ConsentDto:
      properties:
        status:
          $ref: '#/components/schemas/ConsentStatus'
        capturedAt:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Capturedat
      type: object
      required:
        - status
      title: ConsentDto
      description: >-
        Declaración del tenant de que el visitante dio permiso para recibir
        mensajes.


        Esto NO es `CommercialConsentState`, nuestro registro del ciclo de vida
        del consentimiento de un contacto. Es una afirmación externa que no
        podemos verificar: demuestra qué se nos comunicó y cuándo, que es lo que
        presentaríamos si se restringiera el portfolio de un tenant.
    ConsentStatus:
      type: string
      enum:
        - GRANTED
        - NOT_PROVIDED
      title: ConsentStatus

````

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