Skip to content
GTM & RevOps Automation Blueprint10 min read·Updated 2026-11-04

How to Enrich Clay & n8n Outbound Tables with Live ATS Job Postings (2026 Blueprint)

Replace $2–$5/row Clay native job credit markups and $15,000/yr enterprise intent contracts with a direct HTTP API call to 434 ATS & career portals. Filter by company domain, department, tech stack keywords, and posted_since.

1 Credit = 1 Job Record ($0.199–$0.76 / 1K Jobs) · 0 Credits for Empty Searches · 434 ATS & Career Sources

Instant Quickstart · Copy & Run in 30 Seconds

Clay HTTP API Column Setup + Python / n8n Workflow Script

Execute in Live Playground →
import requests

API_KEY = "jp_live_your_api_key"
BASE_URL = "https://api.jobpostingsapi.com/v1"

def enrich_account_hiring_signals(company_domain: str, role_keyword: str = "engineer") -> dict:
    """
    Query active ATS job postings for a specific company domain or slug
    and return ready-to-merge outbound personalization variables.
    """
    resp = requests.get(
        f"{BASE_URL}/companies/{company_domain}/jobs",
        headers={"x-api-key": API_KEY},
        params={"limit": 10, "refresh": "false"},
        timeout=15,
    )
    if resp.status_code == 404:
        return {"hiring_active": False, "open_roles_count": 0}
    resp.raise_for_status()
    payload = resp.json()
    jobs = payload.get("data", [])

    matching = [
        j for j in jobs
        if role_keyword.lower() in j.get("title", "").lower()
    ] or jobs[:3]

    if not matching:
        return {"hiring_active": False, "open_roles_count": 0}

    top_job = matching[0]
    salary = top_job.get("salary") or {}
    return {
        "hiring_active": True,
        "open_roles_count": len(jobs),
        "featured_role_title": top_job.get("title"),
        "featured_role_url": top_job.get("url"),
        "featured_role_ats": (top_job.get("source") or {}).get("name"),
        "salary_range_usd": f"${salary.get('min', 'N/A')} - ${salary.get('max', 'N/A')}",
        "detected_tech_stack": ", ".join(top_job.get("skills") or []),
    }

if __name__ == "__main__":
    signal = enrich_account_hiring_signals("anthropic.com", role_keyword="security")
    print(signal)

Key Engineering Takeaways (TL;DR)

  • ✓Connect JobPostings API directly inside any Clay table using an HTTP API column (`GET /v1/companies/{domain}/jobs` or `GET /v1/jobs/search`) at 0 Clay credits.
  • ✓Outcome-based credit pricing: pay 1 Credit ($0.000199–$0.00076) per matched job record, and 0 Credits whenever a target company has 0 open roles.
  • ✓Every returned job includes AI-normalized USD compensation (`salary.min`, `salary.max`), extracted technical skills (`skills[]`), seniority level, and the direct Greenhouse/Lever/Ashby/Workday apply URL.
  • ✓Pass `?refresh=true` before launching an outbound sequence to re-verify live against the employer's ATS board that the requisition has not been closed.

1. Clay Native Job Enrichment vs. PredictLeads vs. JobPostings API (HTTP Action)

GTM teams running high-volume outbound in Clay or n8n often burn thousands of dollars per month checking whether target accounts are hiring. Here is how direct HTTP API enrichment compares:

Cost & coverage comparison for B2B hiring signal enrichment in Clay and n8n
Capability / Cost MetricJobPostings API (Clay HTTP / n8n)Clay Native Find Jobs WaterfallLegacy Enterprise Intent (PredictLeads / Mantiks)
Starting Price$19/mo (25K Credits) or $25 PAYG$149–$800/mo Clay plan + 2–4 Clay credits/row$500/mo – $1,500+/mo annual contract
Cost When 0 Jobs Match$0.00 (0 Credits deducted)Often consumes lookup credits or waterfall overheadFixed monthly seat/dataset fee
Direct ATS Board Coverage434 sources (Greenhouse, Lever, Ashby, Workday, iCIMS, Rippling)Primarily LinkedIn & aggregated scrapes150–250 sources (delayed batch sync)
Live On-Demand ATS Re-CheckYes (?refresh=true queries employer ATS live)No (cached snapshot)No (weekly or daily batch)
Extracted Tech Stack & USD SalaryIncluded in every record (skills[] + salary{})Requires extra AI prompt credits to parse JDAdd-on technographic module ($10K+/yr)

2. Copy-Paste Clay HTTP API Configuration & n8n Python/JS Node

Add an 'HTTP API' enrichment column in Clay or a Code/HTTP Request node in n8n to fetch active requisitions for any target account or keyword slice:

Clay HTTP API Column Setup + Python / n8n Workflow Script

Query active ATS jobs by company domain or keyword recency and extract ready-to-merge outbound variables (job title, direct ATS URL, USD salary range, and tech stack).

# Clay HTTP API Column Configuration:
# Method: GET
# URL: https://api.jobpostingsapi.com/v1/jobs/search
# Query Params: q="security engineer", posted_since="7d", country="US", limit="5"
curl -sG "https://api.jobpostingsapi.com/v1/jobs/search" \
  -H "x-api-key: jp_live_your_api_key" \
  --data-urlencode "q=security engineer" \
  --data-urlencode "posted_since=7d" \
  --data-urlencode "country=US" \
  --data-urlencode "limit=5"

3. Best Practices for Zero-Waste Clay & n8n Hiring Workflows

Structure your Clay table or n8n cron workflow to maximize reply rates while keeping API credit consumption under $20/month:

  • Use Conditional Run Rules in Clay: Set your Clay HTTP API column to run only when {{company_domain}} is present and ICP Score >= 70. Because JobPostings API charges 0 Credits on empty search results, checking non-hiring ICP accounts is 100% free.
  • Combine Tech Stack + Seniority Signals: Instead of generic 'We saw you are hiring' openers, reference the exact skills[] array (e.g., Snowflake + dbt + Terraform) and USD compensation band returned by the API to prove domain relevance.
  • Verify Stale Requisitions Before Sending: Before enrolling a prospect into a multi-step sequence, pass ?refresh=true to GET /v1/companies/{slug}/jobs to confirm the requisition hasn't already been filled on Greenhouse, Lever, or Ashby.

Interactive Engineering Workbench · GET /v1/jobs/search

Verify real-time latency, pagination math & JSON schema

5,000 jobs/day
2,000 records/day
500 checks/day
HTTP Calls / Day
570
100 jobs/page batching
ATS Sources Covered
434 Sources
1 JSON schema
Empty Search Fee
0 Credits
$0.00 for 0 results
Estimated Monthly Pipeline Cost (30 Days)
$44.78/ mo at Scale rate ($74.25 at Pro rate)
Monthly consumption: 225,000 Credits (7,500 Credits/day)
JobPostings API (Scale $0.199/1K):$44.78 / mo
Legacy Enterprise Job Feeds:$1012.50 / mo
Empty search / 4xx error fee:$0.00 (0 Credits)

Frequently Asked Questions

How do I connect JobPostings API to Clay.com without paying extra Clay credits?
In any Clay table, click 'Add Column' -> 'HTTP API', set Method to GET, URL to https://api.jobpostingsapi.com/v1/jobs/search or https://api.jobpostingsapi.com/v1/companies/{{domain}}/jobs, and add the header x-api-key: jp_live_your_key. Clay HTTP API columns use your own API key at 0 Clay credits.
Do I get charged Credits when a target company in my Clay table has 0 open jobs?
No. JobPostings API uses strict outcome-based credit accounting: 1 Credit = 1 returned job record. When a query returns 0 matching jobs or HTTP 404, 0 Credits are deducted.
Can I trigger an n8n or Make.com workflow whenever a company posts a new role?
Yes. Schedule an n8n Cron node every hour to call GET /v1/feeds/new or GET /v1/jobs/search?posted_since=1h with your target role keywords and push matching companies directly into Clay, HubSpot, or Smartlead.
Does the API return the company's domain name so I can find decision-makers?
Yes. Every job record includes company.name, company.slug, and company.domain alongside the direct ATS board URL (Greenhouse, Lever, Ashby, Workday, iCIMS, etc.).