Automated summary
A minimal end-to-end example that pushes records into a Clay table through a webhook and verifies that the enrichment columns return company data.
Strengths
- Provides copy-paste snippets in curl, Node.js and Python for sending leads
- Covers both a single record and a loop-based batch send across several domains
- Ships an error table for common webhook failures (404, 422, missing enrichment) with fixes
Limitations
- Workbook, webhook source and enrichment column creation stay manual in the Clay UI and are not scripted
- Does not show how to read enriched data back via API — verification happens in the Clay interface
- Assumes the clay-install-auth setup is already completed
Use it when starting a new Clay integration or quickly checking that a webhook and an enrichment column work end to end.
Avoid it for large-scale production pipelines or for reading enriched results programmatically, since it stops at the first test record.
Security analysis
CautionThe skill is benign and clearly scoped to sending test records to a Clay webhook. It does not include destructive commands, obfuscation, credential exfiltration, or safety-disabling instructions. The main risk is expected third-party data transfer and network use, so it warrants caution rather than safe.
- •Sends user-supplied lead data (email, name, domain) to an external Clay webhook; users should avoid real PII/secrets unless intended and compliant.
- •Uses network-capable tools (curl/node) and a configurable webhook URL via CLAY_WEBHOOK_URL; if that variable is compromised, data could be sent to an unintended endpoint.
- •Bash examples include a hard-coded placeholder webhook URL, which may encourage users to paste real webhook URLs into scripts/files.
Examples
Set up the Clay hello world: POST {"domain": "openai.com"} to my Clay webhook URL and tell me whether the company_name, employee_count and industry columns fill in.Send stripe.com, notion.so, figma.com and linear.app to my Clay webhook in a loop and report any non-2xx responses.Write a Node.js script that sends a test lead (jane@stripe.com, domain stripe.com) to my Clay webhook and throws a clear error if the request fails.name: clay-hello-world description: 'Send your first record to Clay and get enriched data back.
Use when starting a new Clay integration, testing webhook setup,
or verifying that enrichment columns are working.
Trigger with phrases like "clay hello world", "clay example",
"clay quick start", "first clay enrichment", "test clay webhook".
' allowed-tools: Read, Write, Edit, Bash(curl:), Bash(node:) version: 1.14.0 license: MIT author: Jeremy Longshore jeremy@intentsolutions.io tags:
- saas
- clay
- api
- testing compatibility: Designed for Claude Code, also compatible with Codex and OpenClaw
Clay Hello World
Overview
Minimal working example: send a company domain to a Clay table via webhook, let Clay's enrichment columns fill in company data, and retrieve the enriched result. Clay does not have a traditional SDK — you interact with it via webhooks (data in), HTTP API columns (data out), and the web UI.
Prerequisites
- Completed
clay-install-authsetup - Clay workbook with a webhook source configured
- At least one enrichment column added to the table
Instructions
Step 1: Create a Clay Table with Enrichment
In the Clay web UI:
- Create a new workbook
- Add columns:
domain,company_name,employee_count,industry - Click + Add at bottom, select Webhooks > Monitor webhook
- Copy the webhook URL
- Add an enrichment column: + Add Column > Enrich Company (uses the
domaincolumn as input)
Step 2: Send Your First Record via Webhook
# Send a single company domain to your Clay table
curl -X POST "https://app.clay.com/api/v1/webhooks/YOUR_WEBHOOK_ID" \
-H "Content-Type: application/json" \
-d '{"domain": "openai.com"}'
Within seconds, Clay creates a new row and auto-runs the enrichment column. The company_name, employee_count, and industry columns fill in automatically.
Step 3: Send Multiple Records
# Batch send — each object becomes a row
for domain in stripe.com notion.so figma.com linear.app; do
curl -s -X POST "https://app.clay.com/api/v1/webhooks/YOUR_WEBHOOK_ID" \
-H "Content-Type: application/json" \
-d "{\"domain\": \"$domain\"}"
echo " -> Sent $domain"
done
Step 4: Send from Node.js
// hello-clay.ts — send records to Clay via webhook
const CLAY_WEBHOOK_URL = process.env.CLAY_WEBHOOK_URL!;
interface LeadInput {
email?: string;
domain?: string;
first_name?: string;
last_name?: string;
linkedin_url?: string;
}
async function sendToClay(lead: LeadInput): Promise<Response> {
const response = await fetch(CLAY_WEBHOOK_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(lead),
});
if (!response.ok) {
throw new Error(`Clay webhook failed: ${response.status} ${response.statusText}`);
}
return response;
}
// Send a test lead
await sendToClay({
email: 'jane@stripe.com',
first_name: 'Jane',
last_name: 'Doe',
domain: 'stripe.com',
});
console.log('Record sent to Clay — check your table for enriched data.');
Step 5: Send from Python
import requests
import os
CLAY_WEBHOOK_URL = os.environ["CLAY_WEBHOOK_URL"]
def send_to_clay(lead: dict) -> requests.Response:
"""Send a lead record to a Clay table via webhook."""
response = requests.post(
CLAY_WEBHOOK_URL,
json=lead,
headers={"Content-Type": "application/json"},
)
response.raise_for_status()
return response
# Test it
send_to_clay({
"email": "jane@stripe.com",
"first_name": "Jane",
"last_name": "Doe",
"domain": "stripe.com",
})
print("Record sent to Clay — check your table for enriched data.")
Error Handling
| Error | Cause | Solution |
|-------|-------|----------|
| 404 Not Found | Invalid webhook URL | Re-copy URL from Clay table settings |
| 422 Unprocessable | Invalid JSON payload | Validate JSON structure before sending |
| Row appears but no enrichment | Enrichment column not configured | Add enrichment column in Clay UI, enable auto-run |
| 429 Too Many Requests | Exceeded webhook rate limit | Add 100ms delay between requests |
| Webhook limit reached (50K) | Webhook exhausted | Create a new webhook source on the table |
Output
- New row(s) visible in your Clay table
- Enrichment columns auto-populated with company/person data
- Console confirmation of successful webhook delivery
Resources
- Clay University — Webhook Integration Guide
- Clay University — Using Clay as an API
Next Steps
Proceed to clay-local-dev-loop for iterating on enrichment workflows locally.
From the file to a first result
The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.
View the source and supporting filesThis download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.
1. Download the file
Download SKILL.mdFrom the root of a test project, save the file as .skill-downloads/clay-hello-world-mrx3xzb1/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.
Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.
mkdir -p '.skill-downloads/clay-hello-world-mrx3xzb1' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/clay-hello-world-mrx3xzb1/download' --output '.skill-downloads/clay-hello-world-mrx3xzb1/SKILL.md.part' && mv '.skill-downloads/clay-hello-world-mrx3xzb1/SKILL.md.part' '.skill-downloads/clay-hello-world-mrx3xzb1/SKILL.md'2. Check prerequisites
Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.
Environment declared by the author: Designed for Claude Code, also compatible with Codex and OpenClaw
Tools declared by the author (check availability in your agent): Read, Write, Edit, Bash(curl:*), Bash(node:*)
Original excerpt: Prerequisites
- Completed
clay-install-authsetup - Clay workbook with a webhook source configured
- At least one enrichment column added to the table
The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.
3. Load the skill
After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.
Claude Code
test -f '.skill-downloads/clay-hello-world-mrx3xzb1/SKILL.md' && test -s '.skill-downloads/clay-hello-world-mrx3xzb1/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/clay-hello-world' && cp -R '.skill-downloads/clay-hello-world-mrx3xzb1' '.claude/skills/clay-hello-world'Codex
test -f '.skill-downloads/clay-hello-world-mrx3xzb1/SKILL.md' && test -s '.skill-downloads/clay-hello-world-mrx3xzb1/SKILL.md' && mkdir -p '.agents/skills' && test ! -e '.agents/skills/clay-hello-world' && cp -R '.skill-downloads/clay-hello-world-mrx3xzb1' '.agents/skills/clay-hello-world'OpenSkills
OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.
Official OpenSkills installationopenskills install './.skill-downloads/clay-hello-world-mrx3xzb1'openskills read 'clay-hello-world-mrx3xzb1'Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.
For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.
openskills syncManual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.
4. Try a first task
Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:
Read .skill-downloads/clay-hello-world-mrx3xzb1/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.
React Hook Form Best Practices
Development
Master React Hook Form: avoid anti-patterns, manage subscriptions, and handle reset, dirty state, and controlled inputs correctly.
Emotion to Mantine Migration
Development
Migrate Emotion styled-components to Mantine components with style props and CSS modules. Use when converting .styled.tsx files or removing @emotion imports.
Scope Creep Detector
Development
Analyzes git diffs against a stated intent to detect scope creep, unrelated files, broad PRs, and oversized changes, then suggests keep, split, or justify actions.