Clay
The Clay integration lets Helios agents search Clay's company and people database, run Clay functions, and query Clay tables through the Clay Public API. It runs agents when an HTTP API column in a Clay table sends a row, or when a Clay function or Workflow run that names your Clay webhook finishes.
What your agents can do
Helios agents use the Clay Public API. They search its endpoints and call the one they need, with your API key attached server-side.
- Find people at target accounts by job title and company size
- Look up a company and its firmographics by domain
- Run a Clay-managed or custom function on up to 100 records, such as finding work emails, and read the results
- Query a known Clay table with filters
- Search and count the runs of Clay Workflows (beta)
- Check the workspace's remaining credits
The Public API can't add rows to a Clay table or edit them. It can't list your tables or functions either, so give the agent the table ID or the function ID in the prompt. A table's ID is the part of its Clay URL after /tables/, such as t_0te9i4tZEHwc9hihBXu.
Clay manages webhooks, Signals, Audiences, and Workflow editing through its CLI and app, not the Public API, so agents can't use them.
Searches count toward the workspace's search quota, which is 100 results per 30 days on the Free plan. Functions use credits as they do in Clay.
Authentication
| Method | Type | Description |
|---|---|---|
| Clay API Key | API Key | A Clay Public API key |
See Integration authentication for how credentials are stored and injected.
Clay API Key
The Public API is available on every Clay plan, including Free. A key belongs to the Clay user who creates it and the workspace it was created in.
- In Clay, open API and CLI in the left sidebar, under Orchestration. If your workspace has no API and CLI page, open Settings → Account → API keys (beta) instead.
- On the API keys tab, click Add API key and enter a Name.
- Under Scopes, keep Public API selected.
- Click Add API key and copy the key. Clay shows it only once.
- In Helios, choose Clay API Key, paste the key into Clay API Key, and save.
Clay's Scopes list can show these options:
| Scope | What it's for |
|---|---|
| Public API | Every endpoint the agent calls: searches, functions, tables, Workflow runs, and credits. Selected by default |
| Table monitoring | Other Clay endpoints that Helios doesn't call. Clay shows it only in some workspaces |
| Account prioritization | Other Clay endpoints that Helios doesn't call. Clay shows it only in some workspaces |
Clay can't change a key's scopes after you create it. To change them, create a new key and enter it through Manage.
To let agents run a custom function, open the function in Clay, open Details, and enable API & CLI. Then give the agent its ID in the form function:t_....
Clay lists table queries as an Enterprise feature. Its help center says basic row reads work on every plan, but joins, ranges, and paging past 100 rows need Enterprise.
If you delete the key in Clay, create a new one and enter it through Manage.
Triggers
Clay can start a Workflow in two ways, and you set up both by hand. Clay's Public API has no endpoint to create webhooks, so Helios can't register them for you.
| Event | Description | Filters |
|---|---|---|
row.sent | An HTTP API column in a Clay table sent a row | table (pattern) |
routine_run.finished | A Clay routine run that names your Clay webhook finished | None |
Table is optional. It matches the table field of the request body, such as Inbound*. Case matters. Rows with a missing or non-text table field only start workflows that have no table filter.
routine_run.finished has no filters. Clay's delivery carries only the webhook's ID and the run's routine_run_id.
A connection has one secret, and both setups use it. If you use both, set the connection's secret to the Clay webhook's signing secret, and put the same value in the HTTP API column's header.
Set up an HTTP API column for row.sent
HTTP API columns need a Clay Growth or Enterprise plan.
-
Save the Clay connection in Helios.
-
Open the connection, click Manage, and open Advanced Configuration. It's collapsed by default. Webhook Setup shows the webhook URL and the secret field.
-
Generate a long random secret, such as the output of
openssl rand -hex 32. Enter it in the secret field under Webhook Setup and save. Do this before you add the column, because Helios rejects every request until the secret is set. If you also use a Clay webhook, use its signing secret instead. -
In your Clay table, click Add enrichment, choose HTTP API, and set:
- Method:
POST. - Endpoint: the webhook URL from Webhook Setup.
- Headers:
x-helios-webhook-secret, set to the secret from step 3. To keep it out of plain text in the column, save it in an HTTP API (Headers) account with Select header account → + Add account. - Body: a JSON object with the columns the agent needs, and the table's name in
table. Put each column reference in quotes, as Clay requires for text values.
{ "table": "Inbound leads", "email": "/Email", "company": "/Company", "domain": "/Domain" } - Method:
-
Under Run settings, click Add run condition if the column should only send rows that are ready, such as rows with an email.
-
Run the column on one row to test it, then on the rest of the table. For new rows to be sent as they arrive, the column must run automatically. Check its run settings in Clay.
Clay doesn't sign HTTP API requests. Helios checks the x-helios-webhook-secret header on every request and rejects requests without the right secret.
Clay sends no delivery ID for HTTP API requests, so Helios processes every request separately. Sending the same row again can start another workflow run, even if its values are unchanged.
Set up a Clay webhook for routine_run.finished
A routine is a Clay function or a Clay Workflow. Clay notifies a webhook when a routine run finishes, but only for runs started with that webhook's ID.
You create Clay webhooks with the Clay CLI. Install it and sign in with clay login, as Clay's quickstart describes. Signing in needs Editor or Admin access to the workspace.
-
Save the Clay connection in Helios. Open it, click Manage, open Advanced Configuration, and copy the webhook URL from Webhook Setup.
-
Create the webhook with that URL:
clay webhooks create <webhook URL>Clay returns the webhook's
idand itssigningSecret. It shows the secret only once. -
Enter the
signingSecretin the secret field under Webhook Setup and save. If an HTTP API column already sends rows to this connection, change itsx-helios-webhook-secretheader to the same value. -
Run
clay webhooks test <id>. It should report"status": "success". Helios accepts the test delivery but doesn't start a run. -
Pass the webhook's
idaswebhook_idwhen you start a run, withPOST /routines/{routine_id}/run,POST /routines/{routine_id}/run-batch/start, orclay routines runs start --webhook-id. For runs that an agent starts, give the agent the ID in its prompt.
When the run finishes, Clay sends a delivery like this:
{
"webhookId": "wh_abc123",
"createdAt": "2026-06-16T17:50:00.000Z",
"data": { "routine_run_id": "run_abc123" }
}The agent reads the results with GET /routines/run/{routine_run_id}/results. For a batch run, GET /routines/run-batch/{routine_run_id}/results returns the status and a download link for the result file.
Clay signs each delivery with the HMAC-SHA256 X-Clay-Signature header, and Helios rejects deliveries without a valid signature. If Clay sends the same run's delivery again within 24 hours, Helios starts only one run. Clay doesn't guarantee delivery, so a finished run can go unreported.
Deleting the connection in Helios doesn't delete the Clay webhook. Remove it with clay webhooks delete <id>.
Agents can't edit Clay rows through the Public API. When the HTTP API column sends a row again, even with unchanged values, it can start another run. Use a run condition, or say in the prompt which rows to ignore.
If a workflow started by routine_run.finished starts a Clay run with the same webhook ID, that run's finish starts the workflow again. Don't give the webhook ID to the agent in that workflow. See Guarding against events you don't want.
Check that it works
- The connection: after you save, the connection's status shows Connected. Error means the connection test failed. Open the connection to read the error.
- An HTTP API column:
- Add
row.sentto a workflow with no filters. - Run the HTTP API column on one row in Clay.
- Check that a run starts. Then open the connection in Helios and click Webhook events to see the event.
- Add
- A Clay webhook:
-
Run
clay webhooks test <id>and check that it reports"status": "success". -
Add
routine_run.finishedto a workflow. -
Run a function on one item with the webhook's ID:
clay routines runs start function:t_... --input '{"items":[{"id":"test-1","inputs":{"domain":"clay.com"}}]}' --webhook-id <id> -
Check that a run starts when the function run finishes. Then open the connection in Helios and click Webhook events to see the event.
-
- Clay's side: the HTTP API column's cell shows Helios's response for that row. A working request returns
{"message":"Webhook received"}.clay webhooks listshows each Clay webhook and its URL.
Common errors
| What you see | Cause | Fix |
|---|---|---|
| The connection's status shows Error | The key was deleted or mistyped | Create a new key in Clay and enter it through Manage |
Agent calls fail with 401 or 403 | The key was deleted, or it doesn't have the Public API scope | Create a new key with Public API and enter it through Manage |
The column gets a 401 | The x-helios-webhook-secret header is missing or doesn't match the secret in Helios | Copy the secret from Webhook Setup into the column's header account |
The column gets a 400 with The request body must be a JSON object | The body isn't valid JSON, often because a text column reference has no quotes | Put each text column reference in quotes, such as "/Email" |
The column gets a 400 with Integration webhook secret not found, or clay webhooks test reports "statusCode": 400, and Webhook events is disabled | No secret is set on the connection | Set the secret under Webhook Setup |
clay webhooks test reports "status": "failed" and "statusCode": 401 | The secret in Helios isn't the webhook's signing secret | Enter the signingSecret from clay webhooks create. If you no longer have it, delete the webhook, create a new one, and use its secret |
The column starts getting 401 after you add a Clay webhook | The connection's secret changed to the webhook's signing secret | Put the signing secret in the column's header account |
Agent calls to /tables/query fail | The query needs an Enterprise plan | Use a search or a function instead, or upgrade |
Agent searches fail with 402 | The workspace reached its search result limit | Wait for the limit to reset, or upgrade the Clay plan |
Agent calls fail with 429 | Clay's rate limit for the workspace was reached | Wait and try again |
| No run starts after a row is sent | The Table filter doesn't match, or the run condition skipped the row | Remove the filter to test, and check the column's run condition |
| No run starts after a Clay run finishes | The run wasn't started with the webhook's ID, the webhook points to another URL, or Clay didn't deliver | Pass the ID as webhook_id, and check the URL with clay webhooks list |
Limits
Clay limits search results by plan. See Clay's search limits for your plan's allowance and reset schedule. Clay also rate-limits each workspace and answers 429 with a Retry-After header. See Clay's rate limits.
Last updated on
Apollo
The Apollo.io integration lets Helios agents search for prospects, enrich contact data, manage sequences, and run sales outreach directly.
Pipedrive
The Pipedrive integration lets Helios agents read and change your Pipedrive CRM through its REST API, and run agents automatically when records are created, updated, or deleted.