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

# Criar contato

> Cria um contato no funil. O token no caminho autoriza criar contato e nada além disso: não lê, não lista e não altera o que já existe.

O corpo pode ser JSON, formulário codificado ou multipart, o que permite apontar um formulário HTML direto para esta URL sem código no meio. Os nomes de campo são aceitos em português e em inglês.

A entrada **não** é idempotente: duas requisições iguais criam dois contatos.


Cria um contato no funil a partir de qualquer sistema que faça uma requisição HTTP.

<Card title="Obrigatório" horizontal>
  Só `email`. O resto entra quando vier, e cada campo aceita variações de nome em
  português e em inglês.
</Card>

**Exemplo mínimo:**

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "email": "maria@empresa.com.br"
}
```

**Exemplo completo:**

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "name": "Maria Silva",
  "email": "maria@empresa.com.br",
  "phone": "11987654321",
  "company": "Empresa Ltda",
  "value": 15000,
  "observation": "Pediu proposta para 20 licenças",
  "source": "Landing de agosto"
}
```

**Exemplo com atribuição de campanha:**

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "name": "Maria Silva",
  "email": "maria@empresa.com.br",
  "campaignId": "23851234567890",
  "campaignName": "Prospecção agosto",
  "adsetId": "23851234567891",
  "adsetName": "Lookalike 1%",
  "adId": "23851234567892",
  "adName": "Criativo vídeo 30s",
  "formId": "1234567890123456"
}
```

O corpo também pode ser formulário codificado ou multipart, o que permite apontar um
formulário HTML direto para a URL, sem código no meio:

```html theme={"theme":{"light":"min-light","dark":"min-dark"}}
<form action="https://crm.suaempresa.com/api/webhooks/receive/SEU_TOKEN" method="POST">
  <input name="name" />
  <input name="email" type="email" required />
  <button>Enviar</button>
</form>
```

<Warning>
  A entrada não é idempotente: duas requisições iguais criam dois contatos. Se o seu
  sistema tem retentativa automática, guarde o `leadId` da primeira resposta bem-sucedida
  e não repita.
</Warning>


## OpenAPI

````yaml openapi.yaml POST /api/webhooks/receive/{token}
openapi: 3.1.0
info:
  title: API da Flunora
  description: >
    Superfície pública da Flunora. Duas capacidades: colocar contatos no funil a
    partir de qualquer sistema, e consultar CPF e CNPJ num bureau de dados
    brasileiro.


    A URL base é o endereço da **sua instância**, não um domínio compartilhado
    da plataforma. Troque `crm.suaempresa.com` pelo seu.
  version: 1.0.0
  contact:
    name: Suporte da Flunora
    email: contato@flunora.com.br
    url: https://docs.flunora.com
servers:
  - url: https://{instancia}
    description: A sua instância da Flunora.
    variables:
      instancia:
        default: crm.suaempresa.com
        description: O domínio da sua instância.
security:
  - chaveDeApi: []
tags:
  - name: Consultas
    description: Ficha cadastral de pessoa e de empresa. Cada consulta é cobrada.
  - name: Entrada de contatos
    description: Criar contato no funil a partir de um sistema externo.
paths:
  /api/webhooks/receive/{token}:
    post:
      tags:
        - Entrada de contatos
      summary: Criar contato
      description: >
        Cria um contato no funil. O token no caminho autoriza criar contato e
        nada além disso: não lê, não lista e não altera o que já existe.


        O corpo pode ser JSON, formulário codificado ou multipart, o que permite
        apontar um formulário HTML direto para esta URL sem código no meio. Os
        nomes de campo são aceitos em português e em inglês.


        A entrada **não** é idempotente: duas requisições iguais criam dois
        contatos.
      operationId: criarContato
      parameters:
        - name: token
          in: path
          required: true
          description: Token do webhook, 48 caracteres hexadecimais.
          schema:
            type: string
            example: SEU_TOKEN
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ContatoDeEntrada'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ContatoDeEntrada'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ContatoDeEntrada'
      responses:
        '200':
          description: Contato criado.
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  leadId:
                    type: string
                    example: clx8k2p9a0001qw3r5t7y9u1i
                  message:
                    type: string
                    example: Lead created successfully
        '400':
          description: >
            Email ausente ou inválido, funil sem etapas configuradas, ou
            organização sem membro ativo para receber o contato.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErroDeEntrada'
        '403':
          description: O webhook existe mas está desligado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErroDeEntrada'
        '404':
          description: O token não corresponde a nenhum webhook.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErroDeEntrada'
        '500':
          description: Falha do lado da plataforma.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErroDeEntrada'
      security: []
components:
  schemas:
    ContatoDeEntrada:
      type: object
      description: >
        Só o email é obrigatório. Cada campo aceita variações de nome, em
        português e em inglês, porque o sistema do outro lado raramente deixa
        escolher.
      required:
        - email
      properties:
        name:
          type: string
          description: Também aceito como `nome`, `full_name` ou `fullName`.
          example: Maria Silva
        email:
          type: string
          description: Também aceito como `e_mail` ou `emailAddress`.
          example: maria@empresa.com.br
        phone:
          type: string
          description: >-
            Também aceito como `telefone`, `celular`, `whatsapp` ou
            `phoneNumber`.
          example: '11987654321'
        company:
          type: string
          description: Também aceito como `empresa` ou `organization`.
        value:
          type: number
          description: Valor do negócio. Também aceito como `valor` ou `amount`.
        observation:
          type: string
          description: Também aceito como `observacao`, `message`, `mensagem` ou `notes`.
        source:
          type: string
          description: >
            Origem do contato. Também aceito como `origem` ou `platform`. O
            webhook pode ter origem padrão, definida no app, que vence este
            campo.
        campaignId:
          type: string
        campaignName:
          type: string
        adsetId:
          type: string
        adsetName:
          type: string
        adId:
          type: string
        adName:
          type: string
        formId:
          type: string
      example:
        name: Maria Silva
        email: maria@empresa.com.br
        phone: '11987654321'
    ErroDeEntrada:
      type: object
      description: >-
        A entrada de contatos erra com um campo `error` em inglês, lido por
        máquina.
      properties:
        error:
          type: string
          example: Valid email is required
  securitySchemes:
    chaveDeApi:
      type: http
      scheme: bearer
      description: >
        Chave de API criada em Configurações, Integrações, Chaves de API. Começa
        com `sk_live_` e aparece uma vez só. O cabeçalho `X-API-Key` também é
        aceito, com o mesmo valor.

````