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

# Connect Hightouch, Census, and Databricks to Default by webhook or API

> Data warehouses and reverse ETL tools such as Hightouch, Census, and Databricks connect to Default by webhook or through the public API, not natively, so each row they send starts a workflow run and the Send to Webhook node sends Default data back out.

Hightouch, Census, and Databricks connect to Default by webhook or through the Default API. Default has
no native warehouse or reverse ETL (extract, transform, load) integration: none of these tools has a
card on the **Integrations** page, and Default does not query a warehouse. The warehouse side sends
rows to Default, and each row starts a workflow run.

## How warehouse data flows to and from Default

| Direction | How it works | Default side |
| - | - | - |
| Into Default, any JSON | A sync or job sends each row as a JSON `POST` to a Default webhook URL. | [**Incoming Webhook** trigger](/workflows/triggers#incoming-webhook), authenticated with the [webhook secret](/settings/webhook-secret) |
| Into Default, a lead to route | A sync or job calls the API with the lead's email and form field values. | [**API** trigger](/workflows/triggers#api), called with [Fire a trigger](/api-reference/triggers/fire-a-trigger) |
| Into Default, through the CRM | A sync writes to Salesforce or HubSpot, and Default reacts to the record change. | [**CRM Record Created** or **CRM Record Updated** trigger](/workflows/triggers#crm-record-created) |
| Out of Default | A workflow sends an HTTP request to an endpoint that loads data into the warehouse. | [**Send to Webhook** node](/workflows/steps-actions#send-to-webhook) |

## Choose between the webhook and the API

| | Incoming webhook | API trigger |
| - | - | - |
| Authentication | The workspace [webhook secret](/settings/webhook-secret) as `Authorization: Bearer` | An API key with `triggers:write`, which an admin creates in **Settings** → **API Keys** |
| Request body | Any JSON, up to 1 MB. You pick fields from a captured sample. | `email`, plus `responses` keyed by the field names of the trigger's **Connected Form** as of the workflow's last publish, and optional `context` |
| Response | `"accepted": true` | An `executionId` and the workflow's `outcome`: `scheduler`, `redirect`, or `none` |
| Good for | Forwarding rows as they are, such as account scores or product usage | Routing a lead and getting back a scheduler to book with |

The API allows 30 requests per minute per key, and a `429` response carries a `Retry-After` header.
Pace large syncs that call the API to stay under that limit. API setup and request examples:
[Route and book through the API](/api/route-and-book).

## Send warehouse rows into Default by webhook

<Steps>
  <Step title="Add the Incoming Webhook trigger">
    In **Workflows**, create a workflow and add the **Incoming Webhook** trigger. Under
    **Connected Webhook**, select **Create new webhook**, or choose an existing webhook.
  </Step>

  <Step title="Copy the URL and the secret">
    Copy the **Ingestion URL**. Reveal and copy the **Bearer secret**. It is your workspace's
    [webhook secret](/settings/webhook-secret), shared by every webhook in the workspace.
  </Step>

  <Step title="Set up the sync or job">
    In Hightouch or Census, set up a destination that sends each row as a `POST` with a JSON body to
    the **Ingestion URL**, with the header `Authorization: Bearer <secret>`. From Databricks, a
    scheduled job can send the same request.
  </Step>

  <Step title="Capture a sample row">
    Select **Listen for test event**, then send 1 row. For the next 5 minutes, Default saves the first
    request it receives as the **Captured payload** and does not start the workflow with it. You can
    also select **Paste a sample**, paste an example row, and select **Save sample**.
  </Step>

  <Step title="Map the person or company (optional)">
    Under **Identity mapping**, choose the column that holds the **Person email** or the
    **Company domain**.
  </Step>

  <Step title="Build, test, and publish">
    Add the nodes that act on the row. Type `{{` in a field to insert values from the captured payload.
    Select **Test**, then **Run Test**, to try it. Select **Publish**, then check that the status
    next to the [deployment switch](/workflows#the-deployment-switch) reads **Live**. A new workflow
    goes live when you first publish it. If the status reads **Paused**, turn the switch on. Each
    row the sync sends now starts the workflow.
  </Step>
</Steps>

A row that looks like this works as a sample:

```json theme={null}
{
  "email": "jane@acme.com",
  "account_domain": "acme.com",
  "fit_score": 87,
  "segment": "Enterprise"
}
```

## Webhook request rules for syncs

* 1 row per request: each request starts 1 run of every published, enabled workflow that uses the
  webhook. A body that holds an array of rows starts 1 run with the whole array. Default answers `200`
  even when no published, enabled workflow uses the webhook.
* Body: JSON, up to 1 MB. Malformed JSON gets a `400` response, and a larger body gets a `413`. A
  mapped **Person email** column that holds text that is not a valid email address also gets a
  `400`. An empty or non-text value is not checked: the row starts the run with the
  **Company domain** instead, if one is mapped, or with no person or company.
* Authentication: a missing or wrong secret gets a `401`. After an admin rotates the
  [webhook secret](/settings/webhook-secret), update the sync with the new one.
* Paused webhook: turning off the webhook's **Active** switch in the trigger makes Default reject
  requests with a `410`.
* Repeat rows: a sync can send the same record again when it changes. Check for an existing CRM
  record with **Match Record** before you route or create, and route only on the **No Match** branch.
  See [CRM nodes](/workflows/steps-crm#match-record).

## Send Default data to a warehouse

Default does not write to a warehouse directly. To land Default data there, add **Send to Webhook** to
the workflow and point it at an endpoint that loads data into the warehouse, such as a service your
data team runs.

<Steps>
  <Step title="Add Send to Webhook">
    Add **Send to Webhook** after the node whose data you want to keep, for example after a
    **Round-Robin** node, or in a workflow that starts from the **Meeting Status** trigger.
  </Step>

  <Step title="Point it at the loading endpoint">
    Set **Request Type** to **POST** and **Request URL** to the loading endpoint.
  </Step>

  <Step title="Set the authorization">
    Choose the **Authorization** the endpoint expects: **API Key**, **Token**, or **Basic**.
  </Step>

  <Step title="Build the body and publish">
    Build the **Body** under **Fields** or **JSON**. Type `{{` to insert values. Publish the workflow
    and check that its status reads **Live**. If it reads **Paused**, turn on the
    [deployment switch](/workflows#the-deployment-switch). Each run now sends its data to the loading
    endpoint.
  </Step>
</Steps>

The endpoint must be reachable on the public internet. Default stops a request after 30 seconds and does
not follow redirects. See [Send to Webhook](/workflows/steps-actions#send-to-webhook).

## What Default does not support with warehouses

* A native Hightouch, Census, or Databricks integration, or a card for them on the **Integrations** page.
* Querying or syncing from a warehouse on a schedule. The warehouse side has to send the data.
* A bulk export API. The public API covers scheduling and firing API triggers.
* Splitting a batch of rows into separate runs.

Related: [Default integrations](https://www.default.com/integrations)


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