Skip to content

Connect Hightouch to AI Agents: Manage Events, Syncs & Destinations

Nidhi KN Nidhi KN 11 min read AI & Agents
TrutoFor teams building AI agents

Give your AI agent Hightouch tools.

Connect Hightouch to AI agents (LangChain, CrewAI) using Truto's /tools endpoint. Bypass custom integration builds, expose stable schemas to your LLM, and build autonomous data activation pipelines.

In this guide

  1. 01Initialize Truto Tool Manager
  2. 02Fetch Hightouch Tools
  3. 03Bind Tools to the LLM
  4. 04Implement Rate Limit Handling
  5. 05Execute Data Workflows

The guide

Learn how to safely connect Hightouch to AI agents using Truto's tools API. Bind tools to LangChain, manage syncs, and handle API rate limits.

You want to connect Hightouch to an AI agent so your system can autonomously define data models, map sync configurations to marketing destinations, trigger Identity Resolution (IDR) graphs, and debug failing event contracts. Here is exactly how to do it using Truto's /tools endpoint and SDK, bypassing the need to write and maintain a custom Hightouch connector from scratch.

Giving a Large Language Model (LLM) read and write access to your reverse ETL platform is a high-stakes engineering challenge. If you give an agent direct access to raw HTTP endpoints, you are responsible for defining the JSON schemas, handling pagination, and managing the OAuth or API key lifecycle. If your team uses ChatGPT, check out our guide on connecting Hightouch to ChatGPT, or if you are building on Anthropic's models, read our guide on connecting Hightouch to Claude. For developers building custom autonomous workflows, you need a programmatic way to fetch these tools and bind them to your agent framework.

This guide breaks down exactly how to fetch AI-ready tools for Hightouch, bind them natively to an LLM using frameworks like LangChain, LangGraph, CrewAI, or the Vercel AI SDK, and execute complex data activation workflows. For a broader look at the architecture behind this approach, refer to our research on architecting AI agents and the SaaS integration bottleneck.

The Engineering Reality of the Hightouch API

Giving an LLM access to external SaaS platforms sounds simple in a prototype. You write a Node.js function that makes a fetch request and wrap it in an @tool decorator. In production against complex data infrastructure systems, this approach collapses.

Hightouch's API introduces several specific integration challenges that break standard REST assumptions. If you hardcode these interactions into your agent, you will spend your sprints writing defensive integration code instead of improving your model's reasoning.

1. Complex Configuration Payloads for Syncs

When creating a sync in Hightouch, you are not just pushing a flat JSON object. The API requires a heavily nested configuration object that maps specific columns from your source data warehouse (e.g., Snowflake, BigQuery) to the target destination's API fields (e.g., Salesforce, Salesforce Marketing Cloud, Braze). LLMs struggle to correctly format these deeply nested configurations without rigid JSON schemas guiding them. If an LLM hallucinates a mapping key, the sync creation will fail, or worse, overwrite the wrong fields in the destination.

2. Asynchronous Job State Management

Many high-leverage operations in Hightouch are asynchronous. When you trigger an Identity Resolution (IDR) run or request an audience model size, the API does not hold the connection open until completion. Instead, it returns a jobId or syncRunId. Standard agent loops assume that when a tool finishes executing, the work is done. With Hightouch, you must build explicit polling loops into your agent framework so the LLM knows to wait and retrieve the final status before proceeding to the next step.

3. Strict Event Contract Enforcement

Hightouch enforces strict governance over event streams via Event Contracts. When defining an event domain, you must specify the onUndeclaredSchema behavior (typically ALLOW or BLOCK). An LLM attempting to dynamically update an event contract must perfectly match the expected schema definition. Any deviation results in HTTP 400 errors, which the LLM must be equipped to parse and recover from.

Abstracting the API with a Unified Tool Layer

To safely expose Hightouch to an AI agent, you need an abstraction layer that standardizes how the agent interacts with the underlying API.

Truto achieves this through two levels of abstraction. First, we define Resources and Methods that map to the underlying Hightouch endpoints. These Proxy APIs handle authentication, normalize pagination, and ensure data is returned in a consistent format. When you call Truto's /tools endpoint, it returns a comprehensive JSON object containing the descriptions and precise JSON schemas for all these methods.

Your agent only sees stable, well-defined tools like create_a_hightouch_sync and hightouch_idrs_trigger. It does not need to know the raw URL paths, nor does it have to guess at the required request body structure.

A Note on Rate Limits

When orchestrating aggressive agent loops, you will inevitably hit API rate limits. It is a critical architectural decision to understand how these are handled. Truto does not retry, throttle, or apply backoff on rate limit errors. When the upstream Hightouch API returns an HTTP 429 Too Many Requests, Truto passes that error directly to the caller.

However, Truto normalizes the upstream rate limit information into standardized headers per the IETF specification:

  • ratelimit-limit
  • ratelimit-remaining
  • ratelimit-reset

The caller (your agent framework or execution loop) is completely responsible for inspecting these headers and implementing the necessary retry and backoff logic. Do not expect the infrastructure to absorb these errors for you.

Hightouch Hero Tools for AI Agents

Exposing the entire Hightouch API to an agent at once will blow out its context window and degrade reasoning performance. Instead, you should provide the agent with a targeted set of high-leverage tools. Here are the core "hero" tools you need for data activation workflows.

create_a_hightouch_model

This tool defines the core data model (the audience or dataset) by providing a SQL query or visual builder configuration that extracts data from the connected source.

Usage Notes: The agent must provide a name, slug, queryType, sourceId, and a boolean isSchema. Ensure the agent has prior context on the valid sourceId before calling this tool.

"Define a new Hightouch model called 'Churn Risk Users' using source ID 4092. The query type is raw SQL. The query should select user_id, email, and last_login from the production schema where the risk_score is greater than 80."

create_a_hightouch_destination

This tool establishes a new connection to a downstream application (like Salesforce, HubSpot, or Braze) where the activated data will be pushed.

Usage Notes: The agent must format the configuration payload exactly according to the requirements of the specific destination type being added.

"Create a new destination in Hightouch named 'Marketing Braze Workspace'. The slug is 'marketing-braze'. Use the Braze destination type and include the API key and REST endpoint in the configuration payload."

create_a_hightouch_sync

This is the workhorse tool. It creates the actual sync pipeline that maps a model to a destination, dictating how often the data moves and how fields are mapped.

Usage Notes: The LLM will need to pass the modelId, destinationId, and a complex configuration object detailing the primary keys and field mappings.

"Set up a new sync called 'Braze Churn Risk Sync'. Connect model ID 1045 to destination ID 309. Map the 'user_id' from the model to the 'external_id' in Braze, and map 'risk_score' to the custom attribute 'churn_risk'. Set the schedule to run daily at midnight."

hightouch_syncs_trigger

This tool initiates an immediate run of a specific sync pipeline, bypassing the standard schedule.

Usage Notes: If a run is already in progress, the new run is queued. The tool returns a syncRunId, which the agent must track if it needs to verify completion.

"Manually trigger the sync for the 'Braze Churn Risk Sync' (sync_id: 8842) right now so the marketing team can launch their retention campaign immediately."

list_all_hightouch_sync_runs

This tool lists the historical and active runs under a specific Hightouch sync, returning metadata about completion ratios, successful rows, and failed rows.

Usage Notes: This is essential for agentic error handling. The agent can use this tool to poll the status of a sync it just triggered or investigate why a previous sync failed.

"Check the status of the last 5 sync runs for sync ID 8842. Tell me if there were any failed rows in the most recent run, and if so, extract the error message."

hightouch_idrs_trigger

This tool triggers a new Identity Resolution (IDR) run for a specific graph, allowing the agent to force the re-computation of unified user profiles.

Usage Notes: The agent must provide the graph_id. This is typically used when new bulk identity data has just been loaded into the warehouse and profiles need immediate updating.

"Trigger an Identity Resolution run for the 'Global B2C Users' graph (graph_id: 112). We just ingested the new acquisition data from the latest brand merger."

For the complete inventory of available tools and exact JSON schema requirements, view the Hightouch integration page.

Workflows in Action

When you arm an LLM with these tools, it transforms from a passive chatbot into an active data operations engineer. Here is how specific personas use these tools to automate complex tasks.

Scenario 1: The Data Engineer Triaging Sync Failures

Data engineers spend hours investigating why a specific marketing sync failed overnight. An agent can automate this investigation.

"Check the sync runs for the 'Salesforce Lead Routing' sync over the last 24 hours. If any runs failed, get the error details and check the underlying model to see if the SQL query is referencing a dropped column."

Execution Steps:

  1. The agent calls list_all_hightouch_syncs (or uses a known ID) to locate the 'Salesforce Lead Routing' sync.
  2. The agent calls list_all_hightouch_sync_runs passing the sync_id to inspect the recent runs.
  3. Identifying a failed run, it reads the error property.
  4. The agent calls get_single_hightouch_sync_by_id to find the associated modelId.
  5. It calls get_single_hightouch_model_by_id to retrieve the raw SQL of the model and compares the selected columns against the error output to diagnose the issue.

Result: The engineer receives a concise summary stating that the sync failed because the lead_score_v2 column was missing from the warehouse, complete with the exact SQL snippet that needs fixing.

Scenario 2: Marketing Ops Launching a Rapid Campaign

Marketing Operations frequently needs to push a highly targeted, one-off audience to an email platform for an urgent communication.

"Create a new model called 'VIP Conference Attendees' using source ID 44. The SQL should select emails from the 'events_db' where event_name is 'Summit2026'. Then, create a sync pushing this model to the Mailchimp destination (ID 89), mapping email to email. Finally, trigger the sync."

Execution Steps:

  1. The agent calls create_a_hightouch_model with the provided SQL and source ID, returning the new modelId.
  2. The agent calls create_a_hightouch_sync, linking the new modelId to the Mailchimp destination ID, structuring the configuration payload to map the email fields.
  3. The agent calls hightouch_syncs_trigger using the newly created sync_id.

Result: The marketing operator defines their entire data activation pipeline and executes it via a single natural language command, readying the audience in Mailchimp in seconds.

Scenario 3: Automated Identity Resolution Updates

After a large batch of raw clickstream data lands in the warehouse, the identity graph must be updated before downstream marketing syncs are run.

"Trigger an Identity Resolution run for the 'Primary User Graph'. Wait for it to finish, and once it is complete, trigger the 'Braze Daily Sync' and the 'Google Ads Audience Sync'."

Execution Steps:

  1. The agent calls hightouch_idrs_trigger with the specific graph_id.
  2. The agent enters a polling loop, repeatedly calling the corresponding status endpoint (e.g., via list_all_hightouch_runs) until the status shows success.
  3. Once complete, the agent calls hightouch_syncs_trigger for both the Braze and Google Ads sync IDs.

Result: The system ensures that marketing channels are only updated with the freshest, fully resolved identity profiles, eliminating race conditions.

Building Multi-Step Workflows

To build these autonomous systems, you must bind Truto's tools to an LLM. Because Truto standardizes everything into OpenAPI schemas, this works seamlessly across LangChain, Vercel AI SDK, or CrewAI.

The following architecture relies on a TrutoToolManager that fetches the proxy APIs from the /tools endpoint. Crucially, the execution loop demonstrates how to inspect HTTP 429 errors and handle the ratelimit-reset header, as the infrastructure will not absorb these limits for you.

sequenceDiagram
    participant Agent as Agent Framework
    participant Truto as Truto Tool Manager
    participant LLM as Large Language Model
    participant Upstream as Upstream API (Hightouch)

    Agent->>Truto: GET /integrated-account/<id>/tools
    Truto-->>Agent: Returns JSON schemas for Hightouch tools
    Agent->>LLM: .bindTools(hightouchTools)
    
    loop Agent Execution
        Agent->>LLM: "Trigger sync 8842 and check status"
        LLM-->>Agent: ToolCall: hightouch_syncs_trigger(sync_id: 8842)
        Agent->>Truto: Execute tool request
        Truto->>Upstream: POST /v1/syncs/8842/trigger
        
        alt Rate Limit Exceeded
            Upstream-->>Truto: HTTP 429 Too Many Requests
            Truto-->>Agent: Throws Error with ratelimit-reset header
            Agent->>Agent: Parse header, await backoff duration
            Agent->>Truto: Retry execution tool request
            Truto->>Upstream: POST /v1/syncs/8842/trigger
            Upstream-->>Truto: HTTP 200 OK (syncRunId: 1092)
        else Success
            Upstream-->>Truto: HTTP 200 OK (syncRunId: 1092)
        end
        
        Truto-->>Agent: Return tool execution result
        Agent->>LLM: ToolMessage (syncRunId: 1092)
    end

Here is how you implement this in TypeScript using LangChain. Notice the explicit error handling wrapping the tool execution to capture the normalized ratelimit-reset header.

import { ChatOpenAI } from "@langchain/openai";
import { AgentExecutor, createOpenAIToolsAgent } from "langchain/agents";
import { TrutoToolManager } from "truto-langchainjs-toolset";
import { ChatPromptTemplate } from "@langchain/core/prompts";
 
// 1. Initialize the Truto Tool Manager
// We pass the specific integrated account ID for the Hightouch connection.
const trutoManager = new TrutoToolManager({
  apiKey: process.env.TRUTO_API_KEY,
  integratedAccountId: "hightouch-account-uuid-1234",
});
 
async function runHightouchAgent() {
  // 2. Fetch the tools dynamically from Truto's /tools endpoint
  console.log("Fetching Hightouch tools...");
  const tools = await trutoManager.getTools();
  console.log(`Successfully loaded ${tools.length} Hightouch tools.`);
 
  // 3. Initialize the LLM and bind the fetched tools
  const llm = new ChatOpenAI({
    modelName: "gpt-4o",
    temperature: 0,
  }).bindTools(tools);
 
  // 4. Define the prompt
  const prompt = ChatPromptTemplate.fromMessages([
    ["system", "You are a data operations agent. You manage Hightouch models, syncs, and destinations. If a tool execution fails with a rate limit error, inform the user."],
    ["human", "{input}"],
    ["placeholder", "{agent_scratchpad}"],
  ]);
 
  // 5. Create the agent and executor
  const agent = await createOpenAIToolsAgent({
    llm,
    tools,
    prompt,
  });
 
  const executor = new AgentExecutor({
    agent,
    tools,
    maxIterations: 10,
  });
 
  // 6. Execute a workflow
  const userInput = "Check the status of the most recent sync run for sync ID 8842.";
  
  try {
    const result = await executor.invoke({ input: userInput });
    console.log("Agent Result:", result.output);
  } catch (error: any) {
    // 7. Explicit Rate Limit Handling
    // Truto passes the 429 upstream error directly. We must handle it here.
    if (error.status === 429) {
      const resetTime = error.headers['ratelimit-reset'];
      console.error(`Rate limit exceeded. Reset time provided by Truto header: ${resetTime}`);
      // Implement your application-level backoff logic here using the resetTime
    } else {
      console.error("Agent execution failed:", error);
    }
  }
}
 
runHightouchAgent();

When a rate limit is hit, the flow chart below visualizes the responsibility split. Truto handles the proxying and normalization of the headers, but the Agent reasoning loop must manage the state and retry strategy.

flowchart TD
    A["Agent requests sync trigger"] --> B["Truto Proxy API"]
    B --> C{"Upstream Hightouch API"}
    C -->|HTTP 200| D["Return syncRunId"]
    C -->|HTTP 429| E["Truto passes 429 error<br>Normalizes headers"]
    E --> F["Agent Executor catches error"]
    F --> G["Agent inspects ratelimit-reset<br>Initiates sleep/backoff"]
    G --> A
    D --> H["Agent polls list_all_hightouch_sync_runs<br>using syncRunId"]

Automate Data Activation Safely

Building an AI agent that can reliably operate your data activation pipelines requires more than just API keys and an LLM. It requires an architectural layer that standardizes API schemas, normalizes pagination and rate limit headers, and restricts the agent to specific, safe operations.

By leveraging Truto's /tools endpoint, you strip away the boilerplate of custom integration maintenance. Your agent gets a stable set of JSON schemas for Hightouch's most powerful capabilities - models, destinations, syncs, and IDR runs - allowing you to focus purely on building better autonomous data workflows.

Two ways to put Hightouch to work

Truto

For product teams

Give your agent Hightouch tools

Your customers connect their own Hightouch accounts. Your product gets one API and MCP tools for Hightouch, through Truto.

FAQ

Does Truto automatically handle API rate limits for Hightouch?
No. Truto passes HTTP 429 Too Many Requests errors directly to the caller. However, Truto normalizes the upstream rate limit information into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset), allowing your agent framework to implement its own backoff logic.
Can I limit which Hightouch tools my AI agent can access?
Yes. When calling the Truto /tools endpoint, you can filter the returned Proxy APIs by specifying query parameters, or you can manually subset the returned JSON schemas before binding them to your LLM using `.bindTools()`.
How do AI agents handle asynchronous jobs in Hightouch?
For asynchronous tasks like triggering syncs or Identity Resolution (IDR) runs, the Hightouch API returns a run ID. Your AI agent must be programmed with a polling loop to query the corresponding status endpoint (e.g., list_all_hightouch_sync_runs) until the job completes.
Hightouch HightouchAI agent tools Get a sandbox

More from our Blog