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

# Enviar submission

> Enviar los datos completados del formulario.

## Endpoint

```
POST /api/forms/{formId}
```

<Info>
  Este endpoint es **público** y no requiere autenticación.
</Info>

## Path Parameters

<ParamField path="formId" type="string" required>
  ID del formulario
</ParamField>

## Request Body

<ParamField body="formId" type="string" required>
  ID del formulario (debe coincidir con el path)
</ParamField>

<ParamField body="formValues" type="object" required>
  Objeto con los valores de cada campo. Las keys corresponden al `name` de cada field.
</ParamField>

<ParamField body="conversationId" type="string">
  ID de conversación existente para vincular la submission
</ParamField>

<ParamField body="messageId" type="string">
  ID de mensaje específico para vincular la submission
</ParamField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST https://app.horneross.com/api/forms/form_abc123 \
    -H "Content-Type: application/json" \
    -d '{
      "formId": "form_abc123",
      "formValues": {
        "name": "María García",
        "email": "maria@ejemplo.com",
        "phone": "+5491123456789",
        "message": "Quiero información sobre el plan Pro",
        "plan": "pro"
      }
    }'
  ```

  ```javascript JavaScript theme={null}
  async function submitForm(formId, values) {
    const response = await fetch(
      `https://app.horneross.com/api/forms/${formId}`,
      {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          formId,
          formValues: values,
        }),
      }
    );
    return response.json();
  }

  const result = await submitForm('form_abc123', {
    name: 'María García',
    email: 'maria@ejemplo.com',
    message: 'Quiero información sobre el plan Pro'
  });
  ```

  ```python Python theme={null}
  import requests

  def submit_form(form_id: str, values: dict) -> dict:
      response = requests.post(
          f'https://app.horneross.com/api/forms/{form_id}',
          headers={'Content-Type': 'application/json'},
          json={
              'formId': form_id,
              'formValues': values
          }
      )
      return response.json()

  result = submit_form('form_abc123', {
      'name': 'María García',
      'email': 'maria@ejemplo.com',
      'message': 'Quiero información'
  })
  ```
</RequestExample>

## Response

<ResponseField name="id" type="string" required>
  ID único de la submission
</ResponseField>

<ResponseField name="formId" type="string" required>
  ID del formulario
</ResponseField>

<ResponseField name="values" type="object" required>
  Valores enviados
</ResponseField>

<ResponseField name="contact" type="object">
  Contacto creado o actualizado automáticamente

  <Expandable title="Propiedades de contact">
    <ResponseField name="contact.id" type="string">
      ID del contacto
    </ResponseField>

    <ResponseField name="contact.email" type="string">
      Email del contacto
    </ResponseField>

    <ResponseField name="contact.firstName" type="string">
      Nombre
    </ResponseField>

    <ResponseField name="contact.lastName" type="string">
      Apellido
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="createdAt" type="string" required>
  Fecha de creación (ISO 8601)
</ResponseField>

<ResponseExample>
  ```json 200 - Success theme={null}
  {
    "id": "submission_abc123",
    "formId": "form_abc123",
    "values": {
      "name": "María García",
      "email": "maria@ejemplo.com",
      "phone": "+5491123456789",
      "message": "Quiero información sobre el plan Pro",
      "plan": "pro"
    },
    "contact": {
      "id": "contact_new123",
      "email": "maria@ejemplo.com",
      "firstName": "María",
      "lastName": "García"
    },
    "createdAt": "2024-01-21T16:00:00Z"
  }
  ```

  ```json 400 - Bad Request theme={null}
  {
    "error": {
      "code": "BAD_REQUEST",
      "message": "Campo requerido faltante: email"
    }
  }
  ```
</ResponseExample>

## Efectos secundarios

Cuando se envía un formulario:

1. **Crea/actualiza contacto**: Si hay campos `email` o `phone`, se crea o actualiza el contacto en el CRM
2. **Notifica al owner**: Se envía email de notificación al dueño del formulario
3. **Dispara webhook**: Si está configurado, se llama al webhook con los datos
