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

# Other tool

> Connect any tool that sends a webhook. No code: a secret address, a test notice, and you confirm what each field is.

If your tool has no [template](/integrations), connect it as **Other tool**. It works with any system that sends a webhook by `POST`: your backend, a Zapier, n8n or Make flow, or a tool with its own notice.

Brein reads the first real notice, suggests what each field is and you confirm. Everything happens in **Settings → Integrations**. Only the workspace owner or an admin can connect and confirm the mapping.

<Steps>
  <Step title="Create the Integration">
    In **Settings → Integrations**, choose **Connect → Other tool**, give it a name and, if you want each notice to open an Opportunity, pick the Pipeline and stage.
  </Step>

  <Step title="Copy the secret address">
    Brein gives you an address shaped like this:

    ```text theme={"theme":"github-light"}
    https://api.trybrein.com/api/v1/door/<Source id>/<token>
    ```

    The token is the Integration's password. It is shown **only once**. Brein stores only a fingerprint of the token, so it cannot show it again. Keep it like any secret.
  </Step>

  <Step title="Send the first real notice">
    Paste the address into your tool and trigger a real notice: a signup, a payment, a response. Or try `curl`:

    ```bash theme={"theme":"github-light"}
    curl -X POST "https://api.trybrein.com/api/v1/door/<id>/<token>" \
      -H "content-type: application/json" \
      -d '{
        "id": "reg-1001",
        "type": "signup",
        "customer": {
          "name": "Ana Torres",
          "email": "ana@acme.mx",
          "phone": "+52 81 5555 0101",
          "company": "Acme"
        },
        "plan": "pro"
      }'
    ```

    Brein answers `202` with the Arrival id and the status `unmapped`: there is no mapping yet, so the notice is stored as the example and no Contact is created.
  </Step>

  <Step title="Review what Brein detected">
    On the Integration's page you see the example with every field and what Brein suggests for it. Detection uses rules, no AI:

    * The **email** by its shape (`something@domain.mx`) and the **LinkedIn** by its address.
    * The **phone** if it starts with `+` and has 7 to 15 digits, or if the field name says so (`telefono`, `phone`, `celular`, `whatsapp`).
    * The **name**, **company**, **role** and **website** by the field name, in Spanish or English (`nombre`, `name`, `empresa`, `company`, `cargo`, `role`, `sitio`, `website`). A first name and a last name in the same block are joined in that order.
    * The **notice id** (`id`, `event_id`, `uuid`...) and the **event type** (`type`, `event`, `topic`...): they do not go to the Contact. They prevent duplicates and tell notices apart.
    * Fields of whoever organizes or administers, or of a product, plan or form, are not taken as the person.
  </Step>

  <Step title="Choose the customer's email">
    If the notice has more than one email, or more than one phone, Brein flags it and you choose which one is the customer's. The others are ignored.
  </Step>

  <Step title="Decide where each field goes and confirm">
    Each field can go to:

    | Destination | What for |
    | - | - |
    | **Contact** | Email, phone, LinkedIn, name or role. |
    | **Company** | Name or website. |
    | **History only** | Stored with the Arrival so you can read what happened, but not written to the Contact. Useful for the plan they chose or what they answered. |
    | **Ignore** | Not stored. |

    The mapping needs at least one email, phone or LinkedIn field. Once confirmed, the mapping is fixed and has a version number. Each change raises the version.
  </Step>
</Steps>

## Batch notices

Some tools send several people in one notice, for example `{ "items": [ ... ] }` or a list at the top level. Brein recognizes lists named `data`, `events`, `items`, `records`, `results`, `entries` or `rows`. Each element of the list becomes **its own Arrival**, with its own result. An element that fails does not stop the others. The response carries a list with the result of each one.

## New fields

The mapping is fixed. If one day the notice carries a field that was not in the example, Brein does not store it: it shows it as a **new field, undecided**. Choose where it goes, or ignore it, and it leaves the list. Until then, that field does not reach the Contact. Up to 200 new fields are kept per Integration.

## Change the mapping and reprocess

You can fix the mapping any time on the Integration's page. Changing it does not touch what was already accepted. For Arrivals that ended up **no person** or **not understood**:

1. Fix the mapping.
2. Choose **Reprocess**, on one Arrival or on all of the Integration's.

Brein reads them again with today's mapping. This works only while the raw notice exists: it is deleted after 30 days. Those that can no longer be reprocessed are counted as expired.

## Rotate the address

If the address leaked, or someone who had it should no longer have it, use **Rotate**. Brein creates a new address, shown only once. **The old one stops working immediately**: update your tool before it sends the next notice, or it will arrive as rejected.

## Limits

| Limit | Value |
| - | - |
| Notice size | 256 KiB |
| Requests per minute | 120 from one IP. After that it answers `429` with `Retry-After`. |
| Formats | JSON, form (`application/x-www-form-urlencoded`) and `multipart/form-data`. |
| Undecided new fields | 200 per Integration |
| Raw notice and example | Deleted after 30 days |

| Response | Means |
| - | - |
| `202` | Received. Carries the Arrival id. It is processed in a queue. |
| `200` | You already had it, or it is a kind of notice the mapping does not use and is ignored. |
| `400` | The body could not be read as JSON, form or multipart. |
| `401` | The address is wrong or was already rotated. It does not say whether the Integration exists. |
| `410` | The Integration is archived. |
| `413` | The notice is over 256 KiB. |
| `429` | Too many requests. Wait and retry. |
| `503` | The Integration is paused. Retry later. |

If you are a developer and want to sign your requests, the signed contract is in [Send events to Brein](/api/door).

What happens to each Arrival, how a person is recognized and what is stored: [Integrations](/integrations).


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