Open API · Coming Soon

Give your stack
access to our agents.

The Tablestakes API lets developers trigger AI agents programmatically — from any CRM, data warehouse, internal tool, or custom automation. Describe a goal. Stream the agent's work in real time. Receive enriched results in your own system.

The Tablestakes API is currently in development. Join the waitlist to get early access and shape the roadmap.
tablestakes-api
$ curl -X POST https://api.tablestakes.com/v1/agent/leads \
  -H "Authorization: Bearer ts_live_sk_..." \
  -H "Content-Type: application/json" \
  -d '{'
    "query": "Find VPs of Sales at Series B SaaS in Austin",
    "limit": 20,
    "save_to_account": true
  }'
 
── Streaming response ─────────────────────────────
data: {"type":"step","step":"parse","status":"running"}
data: {"type":"step","step":"parse","status":"complete",
       "criteria":{"titles":["VP of Sales"],"location":"Austin, TX"}}
data: {"type":"step","step":"search","status":"running"}
data: {"type":"step","step":"search","status":"complete","found":34}
data: {"type":"step","step":"enrich","status":"complete","verified":18}
data: {"type":"leads_enriched","count":20}
data: {"type":"done","saved":20,"job_id":"job_8f2a1c"}
───────────────────────────────────────────────────
● Complete · 20 leads saved

Join the API waitlist — be first when we launch

What developers are building
with the Tablestakes API.

The API exposes the full capability of Tablestakes agents as programmable endpoints — so your team can embed lead sourcing, prospect research, and outreach into any workflow you already run.

🔄
CRM Enrichment
Trigger the Lead Sourcing Agent from inside Salesforce or HubSpot. Auto-populate new leads with verified emails, titles, company data, and fit scores without leaving your CRM.
📊
Data Warehouse Pipelines
Pull enriched lead and company data directly into Snowflake, BigQuery, or Redshift. Build your own lead scoring models on top of Tablestakes-sourced data.
🤖
Slack & Internal Tools
Build a /find-leads Slack command that triggers the agent and posts results to a channel. Give your whole sales team agent access without leaving where they work.
🗂
Custom Sales Dashboards
Pull live lead counts, enrichment status, and outreach activity into your own internal reporting dashboards. Own your data visualization layer while we handle the sourcing.
Zapier & Make Automations
Connect agents to thousands of tools via webhook-friendly API responses. Trigger a lead search when a new account is created. Send a research brief when a deal moves stages.
🏗
White-Label Products
Build your own sales intelligence product on top of the Tablestakes API. Our agent infrastructure, your brand, your users. Contact us for partner pricing.

A streaming, event-driven API
built for async agent tasks.

Agent tasks aren't instant — they involve multiple tool calls, data lookups, and enrichment steps that take seconds to complete. The API is built around server-sent events (SSE) so your application receives real-time progress updates as the agent works, rather than waiting for a single slow response.

📡
Streaming First
Every agent endpoint streams progress events via SSE. Your UI can show a live agent trace — the same one Tablestakes users see — or simply wait for the final result event.
🔁
Job-Based for Long Tasks
Long-running tasks return a job_id immediately. Poll the status endpoint or subscribe to the event stream — no timeouts, no dropped connections.
🔑
API Key Authentication
Every request is authenticated with a bearer token scoped to your account. Keys are created in the Tablestakes dashboard and can be scoped to specific agents, rate limits, or user IDs.

The endpoints.

POST /v1/agent/leads Trigger the Lead Sourcing Agent with a natural language query. Streams SSE progress events.
POST /v1/agent/leads Authorization: Bearer ts_live_sk_... Content-Type: application/json { "query": "Find VPs of Sales at Series B SaaS companies in Austin", "limit": 20, "user_id": "usr_abc123", "save_to_account": true, "filters": { "exclude_domains": ["competitor.com"], "min_score": 70, "verified_email_only": true } }
data: {"type": "step", "step": "parse", "status": "running"} data: {"type": "step", "step": "search", "status": "complete", "found": 34} data: {"type": "step", "step": "filter", "status": "complete", "qualified": 20} data: {"type": "step", "step": "enrich", "status": "complete", "verified": 18} data: {"type": "leads_enriched", "leads": [ { "name": "Sarah Chen", "title": "VP of Sales", "company": "Finstack Inc", "email": "s.chen@finstack.io", "email_verified": true, "score": 94, "funding_stage": "series_b", "location": "Austin, TX" } ]} data: {"type": "done", "saved": 20, "job_id": "job_8f2a1c"}
POST /v1/agent/research Coming Soon Trigger the Prospect Research Agent. Returns a structured brief with signals, funding, and tech stack.
POST /v1/agent/research Authorization: Bearer ts_live_sk_... { "target": "Gridline AI", "depth": "standard", "user_id": "usr_abc123" }
{ "company": "Gridline AI", "domain": "gridline.ai", "funding": { "stage": "series_b", "amount": "$24M", "date": "2024-09" }, "headcount": 87, "headcount_growth_90d": "+22%", "tech_stack": ["Salesforce", "HubSpot", "Outreach"], "trigger_events": ["New CRO hired 3 weeks ago", "3 open AE roles on LinkedIn"], "brief": "Strong fit. New CRO is 3 weeks in and likely evaluating the full sales stack..." }
POST /v1/agent/outreach Coming Soon Trigger the Outreach Agent to draft and optionally send a personalized email.
POST /v1/agent/outreach Authorization: Bearer ts_live_sk_... { "contact_email": "marcus@meridiansaas.com", "sender_user_id": "usr_abc123", "research_job_id": "job_8f2a1c", "auto_send": false }
{ "draft": { "to": "marcus@meridiansaas.com", "subject": "Congrats on the raise, Marcus — quick thought on pipeline", "body": "Hi Marcus, Saw that Meridian just closed your Series B..." }, "status": "pending_approval", "approve_url": "https://app.tablestakes.com/outreach/draft_xyz" }
GET /v1/jobs/{job_id} Check the status of any agent job by ID.
{ "job_id": "job_8f2a1c", "status": "complete", "agent": "lead_sourcing", "created_at": "2025-05-01T14:23:00Z", "completed_at": "2025-05-01T14:23:08Z", "result_count": 20, "saved": true }
GET /v1/leads Retrieve saved leads for a user with optional filters and pagination.
user_id string required limit integer default 100, max 500 offset integer pagination offset min_score integer filter by minimum lead score since ISO 8601 filter by creation date
{ "leads": [...], "total": 247, "limit": 100, "offset": 0 }
DELETE /v1/leads/{lead_id} Delete a saved lead from a user's account.
{ "deleted": true, "lead_id": "lead_abc123" }

Get running in minutes.

Three lines of setup. One function call. Live streaming results.

Python
Node.js
cURL
import httpx
import json

API_KEY = "ts_live_sk_..."
BASE_URL = "https://api.tablestakes.com/v1"

def source_leads(query: str, limit: int = 20):
    """Stream lead sourcing results from the Tablestakes API."""

    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json",
        "Accept": "text/event-stream",
    }

    payload = {
        "query": query,
        "limit": limit,
        "save_to_account": True,
    }

    with httpx.stream("POST", f"{BASE_URL}/agent/leads",
                      headers=headers, json=payload) as r:
        for line in r.iter_lines():
            if line.startswith("data: "):
                event = json.loads(line[6:])

                if event["type"] == "step":
                    print(f"[{event['step']}] {event['status']}")

                elif event["type"] == "leads_enriched":
                    leads = event["leads"]
                    print(f"\n✓ {len(leads)} leads found:")
                    for lead in leads:
                        print(f"  {lead['name']} · {lead['title']} · score: {lead['score']}")

                elif event["type"] == "done":
                    print(f"\n● Complete · {event['saved']} saved")
                    break

# Run it
source_leads("Find VPs of Sales at Series B SaaS companies in Austin")
const API_KEY = "ts_live_sk_...";
const BASE_URL = "https://api.tablestakes.com/v1";

async function sourceLeads(query, limit = 20) {
  const response = await fetch(`${BASE_URL}/agent/leads`, {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${API_KEY}`,
      "Content-Type": "application/json",
      "Accept": "text/event-stream",
    },
    body: JSON.stringify({ query, limit, save_to_account: true }),
  });

  const reader = response.body.getReader();
  const decoder = new TextDecoder();

  while (true) {
    const { done, value } = await reader.read();
    if (done) break;

    const lines = decoder.decode(value).split("\n");
    for (const line of lines) {
      if (!line.startsWith("data: ")) continue;
      const event = JSON.parse(line.slice(6));

      if (event.type === "step") {
        console.log(`[${event.step}] ${event.status}`);
      } else if (event.type === "leads_enriched") {
        console.log(`\n✓ ${event.leads.length} leads found`);
        event.leads.forEach(lead => {
          console.log(`  ${lead.name} · ${lead.title} · ${lead.company}`);
        });
      } else if (event.type === "done") {
        console.log(`\n● Complete · ${event.saved} saved`);
        break;
      }
    }
  }
}

sourceLeads("Find VPs of Sales at Series B SaaS companies in Austin");
curl -X POST https://api.tablestakes.com/v1/agent/leads \
  -H "Authorization: Bearer ts_live_sk_..." \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -d '{
    "query": "Find VPs of Sales at Series B SaaS in Austin",
    "limit": 20,
    "save_to_account": true
  }'

API access included in every plan.

Every Tablestakes plan includes API access. Limits scale with your plan — upgrade anytime from your dashboard.

Plan API Calls / Month Agent Calls / Day Concurrent Jobs Webhooks
Starter ($89/mo) 1,000 100 2
Pro ($199/mo) 10,000 500 10
Team Custom Custom Custom

Rate limits are enforced server-side per API key. Exceeding your limit returns a 429 Too Many Requests response with a Retry-After header. Limits reset on the first of each calendar month.

API keys, scoped and simple.

Every Tablestakes API request is authenticated with a bearer token. Keys are created and managed in your Tablestakes dashboard — no external key management required.

# All requests require this header Authorization: Bearer ts_live_sk_xxxxxxxxxxxxxxxx # Key prefixes ts_live_sk_ → Live key (production) ts_test_sk_ → Test key (sandbox, no real data consumed)
🔑 Key Scoping
Keys can be scoped to specific agents, specific user IDs, or read-only access. Create separate keys for each integration or environment to limit blast radius.
🧪 Sandbox Mode
Test keys (ts_test_sk_) return realistic mock data without consuming API credits or querying live data sources. Use them freely during development.
🔄 Key Rotation
Rotate keys at any time from your dashboard without downtime. Old keys remain valid for 24 hours after rotation to allow graceful transitions in your deployments.
🪝 Webhook Signing
All outbound webhook payloads are signed with a shared secret using HMAC-SHA256. Verify the X-Tablestakes-Signature header on every inbound webhook.

Be first when
the API launches.

Join the waitlist. Shape the roadmap. Get early access before general availability.

Join the API waitlist