Developers

MCP Server, REST API, and everything you need to build on OnlyData Club.

MCP Server

Manage professional identities from Claude Code, Claude Desktop, Cursor, or any MCP-compatible AI agent.

shell
# Local (Claude Code, Cursor, Desktop)
npx @onlydata/mcp-server

# Remote (Claude.ai, Streamable HTTP)
https://mcp.onlydata.club/mcp

No API key needed. Read tools work immediately. Write tools use OAuth 2.1 (automatic in Claude.ai).

Claude Code config

~/.claude/settings.json
{
  "mcpServers": {
    "onlydata": {
      "command": "npx",
      "args": ["@onlydata/mcp-server"]
    }
  }
}

MCP Tools

ToolAccessDescription
Profiles
get_profilePublicGet a profile by slug
list_profilesPublicList all public profiles, optionally filter by type
search_profilesPublicServer-side profile filter (query, profile_source, claimed_only, has_contact, company_slug) — returns linkedin_url + website + verified_email
create_profileAuthCreate a person or company profile
update_profileAuthUpdate profile fields
Signals & Verification
set_signalsAuthSet open-to signals (recruiting, advisory, etc.)
set_coop_sharingAuthEnable/disable cooperative sharing
get_verificationPublicFull attribute provenance for any profile
verify_domainAuthVerify company domain ownership (DNS, file, or meta tag)
Messaging
send_messageAuthMessage another member
get_inboxAuthRead your messages
get_sent_messagesAuthView sent messages
Businesses
search_businessesPublicSearch 21,300+ businesses with rich filters
get_businessPublicFull firmographic profile by ID or name
get_similar_businessesPublicFind similar businesses by attributes
get_company_locationsPublicAll locations for a multi-location brand
match_companyPublicMatch company by name, domain, phone, or email
Curated Datasets
list_datasetsPublicList all curated datasets
browse_datasetPublicBrowse companies in a dataset by slug
list_public_datasetsPublicList all public custom datasets (company, person, other)
browse_public_datasetPublicBrowse a public custom dataset by slug — supports person datasets (e.g. ai-builders)
get_dataset_historyPublicLiving-dataset changelog for a public dataset (slug or UUID)
get_dataset_snapshotsPublicDaily metric timeline — row_count, attribute_fills, role/company/location breakdowns
get_dataset_fieldsPublicField dictionary — type, description, enum values, coverage target per column
attribute_detailPublicDeep dive on a specific business attribute
Upload & Custom Datasets
upload_dataAuthUpload CSV/JSON for entity resolution and enrichment
list_uploadsAuthList upload history
query_uploadPublicQuery rows from a specific upload
create_custom_datasetAuthUpload arbitrary CSV as a private dataset
list_custom_datasetsPublicList custom datasets
query_custom_datasetPublicQuery a custom dataset with keyword search + per-column filters
Semantic Search & Discovery
semantic_searchPublicVector search by meaning across all businesses
semantic_search_datasetAuthNatural-language similarity search within a custom dataset (pgvector)
Jobs & Candidate Match
post_job_openingAuthCreate a job opening; auto-embeds against AI Minds for matching
list_job_openingsAuthList your job openings
match_candidates_for_jobAuthRank AI Minds candidates for a job — semantic + transition/signals/contact boosts
match_jobs_for_personPublicReverse match — jobs that fit a given profile slug
ai_minds_at_companyPublicTalent graph at a company — AI Minds people linked, transition distribution, AR score
subscribe_ai_minds_webhookAuthPush updates when rows transition / get claimed / get matched. HMAC-signed.
list_ai_minds_webhooksAuthYour webhook subscriptions + health
suggest_ai_minds_personAuthContribute a candidate to the dataset — admin review queue
record_job_feedbackAuthLog a recruiter action on a candidate (shortlisted/contacted/hired/...)
find_similarPublicFind semantically similar businesses
create_segmentPublicCreate micro-segment from natural language description
scan_agent_readinessPublicScan a website and auto-publish agent readiness report
score_person_readinessPublicScore a person's AI readiness — person_ar_v2, source-aware: 4 external dims (max 80) + OnlyData engagement (max 20). Elite external evidence alone can reach AI-FORWARD.
prospect_dashboardAuthInteractive prospect intelligence dashboard with ICP-scored companies and action cards
company_briefPublicOne-pager company intelligence brief with AR score, industry, team, and enrichment data
render_strategy_pagePublicRender a private, password-gated strategy page (e.g. sturdy-v2) inline in Claude as a visual artifact
onlydata_overviewPublicPlatform overview and usage guide
Data Requests
request_dataAuthSubmit a natural language data request
list_data_requestsPublicList your data requests
get_data_requestPublicGet details for a specific data request
Artifacts
create_artifactAuthCreate HTML/SVG/Markdown/React artifact on a profile
import_claude_artifactAuthImport an artifact from another Claude conversation
list_artifactsPublicList artifacts on a profile
get_artifactPublicGet a single artifact with source
update_artifactAuthUpdate artifact fields or content
publish_artifactAuthPublish a draft artifact
delete_artifactAuthDelete an artifact permanently
list_artifact_sharesPublicList who an artifact is shared with
share_artifact_with_workspaceAuthGrant a Rally workspace read access
share_artifact_with_emailAuthGrant an email address read access
unshare_artifact_workspaceAuthRevoke workspace share
unshare_artifact_emailAuthRevoke email share
Workspace & Team
list_my_workspacesAuthList Rally workspaces you belong to
list_pending_extractionsPublicList pending team member extractions
publish_team_extractionAuthPublish extracted team members as profiles
User Lists
list_user_listsAuthList your saved company/contact lists
get_user_listPublicGet a list by slug with hydrated members
create_user_listAuthCreate a new named list
add_to_user_listAuthAdd a company by domain or ID
remove_from_user_listAuthRemove a member from a list
update_user_listAuthUpdate list name, description, or visibility
build_user_listAuthResearch & populate a list from our company database
get_list_build_statusPublicCheck build/enrichment progress of a list
Career
create_tailored_resumeAuthGenerate a tailored resume for a specific job
Changelog
get_changelogPublicRecent changes across OnlyData, Rally, and PH
Dataset History (Living Datasets)
get_dataset_historyPublicChangelog entries for a public dataset — methodology, backfills, attribute changes (slug or UUID)
get_dataset_snapshotsPublicDaily metric timeline — row_count, attribute_fills, role/company/location breakdowns, since + limit params
get_dataset_fieldsPublicField dictionary — per-column type, examples, enums, quality rules, coverage targets

No tools match your search.

Access levels

No account needed

Search and read all public profiles, verification data, and metadata. Anyone — human or agent — can query OnlyData without authentication.

  • Browse and search all public profiles
  • Read full profile data (name, headline, about, roles, skills, projects)
  • Get verification and provenance JSON for any profile
  • Access OpenAPI spec, llms.txt, MCP manifest, sitemap

With account (OAuth 2.1)

Create a free account at /join. Write operations authenticate via OAuth 2.1 with Dynamic Client Registration — no API key setup needed. With an account you can:

  • Create and update your own profile
  • Set availability signals (open to recruiting, advisory, partnerships)
  • Send and receive messages from other members
  • Enable cooperative sharing (opt your profile into partner networks)
  • Configure what's shareable (email, phone, signals are all user-controlled)

Rate limits

Each caller has a cost budget per 60-second rolling window. Individual MCP tools (and the equivalent HTTP endpoints) consume cost_units according to how expensive they are to run.

TierBudget per 60sKeyed by
Authenticated500 cost_unitsSupabase user id (JWT sub)
Anonymous50 cost_unitshashed source IP

Per-call costs (rough):

  • 1 — cheap indexed reads: get_profile, get_business, get_dataset_history/snapshots/fields, get_changelog
  • 3 — shallow searches: list_profiles, search_profiles, unlisted tools default
  • 5 — dataset-scan queries: search_businesses, match_company, get_similar_businesses
  • 10 — vector / embedding: semantic_search
  • 20 — multi-call fan-out: company_brief, prospect_dashboard, score_person_readiness, create_tailored_resume
  • 30 — rendered pages: render_strategy_page
  • 50 — browser scans (real $): scan_agent_readiness

Full cost table lives in mcp-server/lib/rate-limit.js — source of truth.

When you exceed budget the MCP tool returns isError: true with payload:

{
  "error": "rate_limit_exceeded",
  "message": "Budget exceeded for 'scan_agent_readiness'. Retry in 27s.",
  "retry_after_seconds": 27,
  "tier": "authenticated",
  "window_ends_at": "2026-04-21T20:15:00.000Z"
}

HTTP endpoints return 429 with the same JSON body plus headers Retry-After: <seconds>, X-RateLimit-Tool, X-RateLimit-Tier, X-RateLimit-Remaining.

A well-behaved agent should read retry_after_seconds, back off, and retry — not tight-loop the same tool call.

REST API

Full OpenAPI 3.0 spec at /openapi.json. Key endpoints:

MethodEndpointAccess
GET/api/profilesPublic
GET/api/profile/:slugPublic
GET/api/profile/:slug/verificationPublic
GET/api/coop/profilesPublic
POST/api/claimAuth
PATCH/api/profile/:slugAuth
POST/api/profile/:slug/signalsAuth
POST/api/messages/sendAuth
GET/api/messages/inboxAuth
GET/api/verify-domain/instructions/:slugPublic
POST/api/verify-domain/:slugAuth
GET/api/agent-readinessPublic
GET/api/agent-readiness/:slugPublic
# List all profiles
curl https://onlydata.club/api/profiles

# Get a profile by slug
curl https://onlydata.club/api/profile/jane-doe

# Authenticated request
curl -H "x-api-key: od_your_key" \
  https://onlydata.club/api/me
// List all profiles
const res = await fetch('https://onlydata.club/api/profiles');
const { profiles } = await res.json();

// Authenticated request
const res = await fetch('https://onlydata.club/api/me', {
  headers: { 'x-api-key': 'od_your_key' }
});
import requests

# List all profiles
res = requests.get('https://onlydata.club/api/profiles')
profiles = res.json()['profiles']

# Authenticated request
res = requests.get(
    'https://onlydata.club/api/me',
    headers={'x-api-key': 'od_your_key'}
)

Authentication

Three methods: OAuth 2.1 (recommended for MCP connections — automatic in Claude.ai), API key (for scripts and direct API calls), or Supabase JWT (browser sessions). MCP connections use OAuth automatically — no setup needed.

# API key (recommended)
curl -H "x-api-key: od_your_key" \
  https://onlydata.club/api/me

# Supabase JWT (browser sessions)
curl -H "Authorization: Bearer eyJ..." \
  https://onlydata.club/api/me
// API key
const res = await fetch('https://onlydata.club/api/me', {
  headers: { 'x-api-key': 'od_your_key' }
});

// Supabase JWT
const res = await fetch('https://onlydata.club/api/me', {
  headers: { 'Authorization': `Bearer ${token}` }
});
import requests

# API key
res = requests.get(
    'https://onlydata.club/api/me',
    headers={'x-api-key': 'od_your_key'}
)

# Supabase JWT
res = requests.get(
    'https://onlydata.club/api/me',
    headers={'Authorization': f'Bearer {token}'}
)

Webhooks

Push and pull data with webhooks. Receive data to trigger enrichment, or subscribe to events when data changes.

Incoming: Ingest Companies

Send companies to OnlyData for entity resolution and enrichment. Each company is matched against existing entities or created as new. The full enrichment pipeline runs automatically.

POST /api/webhooks/ingest
curl -X POST https://onlydata.club/api/webhooks/ingest \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -d '{
    "companies": [
      {"name": "Acme Corp", "domain": "acme.com", "city": "Boise", "state": "ID"},
      {"name": "TechStart", "domain": "techstart.io"}
    ]
  }'

Response includes entity IDs and which enrichment models were queued:

Response
{
  "ok": true,
  "created": 1,
  "existing": 1,
  "results": [
    {"action": "exists", "id": 1234, "name": "Acme Corp", "domain": "acme.com"},
    {"action": "created", "id": 5678, "name": "TechStart", "domain": "techstart.io",
     "models_queued": ["verify_v1","industry_v2","description_v1","agent_readiness_v2","mx_profile_v2","ai_native_v1","agent_role_v1"]}
  ]
}

Outgoing: Subscribe to Events

Register a URL to receive signed POST requests when data changes. Each delivery includes an HMAC-SHA256 signature in the X-Webhook-Signature header.

EventWhen
business.createdNew entity created (via upload, scan, webhook ingest, or MCP)
business.enrichedEnrichment model completes (includes model name + fields updated)
business.classifiedAI classification completes (ai_native, agent_role)
business.cascadeCascade triggered — downstream models re-queued due to field change
business.scannedAgent readiness scan completes
Register a webhook
curl -X POST https://onlydata.club/api/webhooks \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://your-app.com/hooks/onlydata", "events": ["business.enriched", "business.classified"]}'

The response includes a secret_shown_once — save it for signature verification. Webhooks auto-disable after 10 consecutive delivery failures.

Signature Verification

Verify (Node.js)
const crypto = require('crypto')
const sig = req.headers['x-webhook-signature']
const expected = crypto.createHmac('sha256', YOUR_SECRET).update(JSON.stringify(req.body)).digest('hex')
if (sig !== expected) return res.status(401).send('Bad signature')

Cascade Rules

When upstream fields change, dependent models automatically re-queue. This implements the enrichment pipeline cascade logic:

Field ChangedRe-queues
descriptionb2b_v2, ai_native_v1
super_categoryb2b_v2, employee_v1
nameindustry_v2, description_v1
domainagent_readiness_v2, mx_profile_v2
ai_nativeai_stack_v1 (if non-none)

Domain Verification

Prove ownership of a company domain to get a verified badge. Three methods available — pick whichever fits your setup. Verified companies also auto-elevate team members whose email domains match.

Step 1: Get instructions

shell
curl https://onlydata.club/api/verify-domain/instructions/your-company

Step 2: Choose a method

MethodWhat to doBest for
dns Add TXT record: onlydata-verify=your-slug Recommended — strongest proof, works for any domain
file Host /.well-known/onlydata-verify.txt with your slug Easy if you control the web server
meta Add <meta name="onlydata-verify" content="your-slug"> to homepage Quick — just a one-line HTML change

Step 3: Trigger verification

# DNS verification
curl -X POST https://onlydata.club/api/verify-domain/your-company \
  -H "x-api-key: od_your_key" \
  -H "Content-Type: application/json" \
  -d '{"method": "dns"}'

# File verification
curl -X POST https://onlydata.club/api/verify-domain/your-company \
  -H "x-api-key: od_your_key" \
  -H "Content-Type: application/json" \
  -d '{"method": "file"}'

# Meta tag verification
curl -X POST https://onlydata.club/api/verify-domain/your-company \
  -H "x-api-key: od_your_key" \
  -H "Content-Type: application/json" \
  -d '{"method": "meta"}'
const res = await fetch('https://onlydata.club/api/verify-domain/your-company', {
  method: 'POST',
  headers: {
    'x-api-key': 'od_your_key',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ method: 'dns' })
});
import requests

res = requests.post(
    'https://onlydata.club/api/verify-domain/your-company',
    headers={'x-api-key': 'od_your_key'},
    json={'method': 'dns'}
)

On success

  • Profile gets verified status with green badge
  • Verification proof stored in profile_data.domain_verification
  • Team members with matching email domains are auto-elevated to verified

Admin override

Admins can verify any profile directly — no DNS/file check needed:

shell
curl -X POST https://onlydata.club/api/admin/verify/your-company \
  -H "x-admin-key: YOUR_ADMIN_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status": "verified", "domain": "yourcompany.com"}'

MCP tool

Agents can verify domains through the MCP server:

json
// Get instructions (omit method)
{ "tool": "verify_domain", "args": { "slug": "your-company" } }

// Attempt DNS verification
{ "tool": "verify_domain", "args": { "slug": "your-company", "method": "dns" } }

Agent Readiness Scores

Every OnlyData profile with a website is scanned for agent-readiness signals. Scores range 0–100 using Algorithm E — “Spread” (v3, April 2026): web quality is capped at 30 points, llms.txt adds +15, openapi.json +15, ai-plugin.json +10, mcp.json +25, plus small bonuses for JSON-LD and for discovering agent endpoints on developer / docs / api subdomains. The scanner probes developer.<domain>, developers.<domain>, docs.<domain>, and api.<domain> in parallel so companies that expose their API behind a dev subdomain get credit. Soft-404 detection prevents false positives. There are two meaningful ceilings: ~50 for a well-behaved SaaS site that ships llms.txt but no API, and 100 for true agent-native infrastructure with MCP + OpenAPI + ai-plugin. Six underlying categories:

CategoryWhat it measures
Crawlabilityrobots.txt, sitemap.xml
Machine ReadabilityJSON-LD, schema.org, meta tags
API ReadinessOpenAPI spec, API docs links
Agentic Commerceai-plugin.json, MCP manifest, llms.txt
Content AccessRSS/Atom feeds, clean HTML
Agent SignalsExplicit MCP, LLM, and agent support
# All scores (ranked)
curl https://onlydata.club/api/agent-readiness

# Single profile
curl https://onlydata.club/api/agent-readiness/producthacker
// All scores
{ "tool": "get_agent_readiness" }

// Single profile
{ "tool": "get_agent_readiness", "args": { "slug": "producthacker" } }

Scans run on a periodic schedule with soft-404 detection. Under Algorithm E (v3), a bare site with only robots.txt + sitemap scores ~15. A well-built SaaS with llms.txt + JSON-LD hits the well-behaved ceiling at ~50. Crossing 50 requires real API exposure — openapi.json, ai-plugin.json, or mcp.json at the root or on a dev subdomain. True agent-native infrastructure with all three reaches 90+.

Agent-readable files

FilePurpose
/llms.txtLLM-readable site description
/openapi.jsonOpenAPI 3.0 specification
/mcp.jsonMCP tool manifest
/.well-known/ai-plugin.jsonAI plugin manifest
/sitemap.xmlDynamic sitemap
/robots.txtCrawler rules (AI bots welcome)
shell
# Fetch LLM description
curl https://onlydata.club/llms.txt

# Fetch OpenAPI spec
curl https://onlydata.club/openapi.json

# Fetch MCP manifest
curl https://onlydata.club/mcp.json

Micro-Segments

Create segments from natural language descriptions. Returns matching businesses + stats: count, industry breakdown, avg agent readiness.

MCP tool: create_segment

Example: "upscale dining establishments with strong web presence"

Vibe Prompts

Copy-paste these into Claude (Code or Desktop) with the OnlyData MCP connected. Each one works immediately.

Search & Discovery

"Find B2B restaurants in Boise with agent readiness over 50"
"Search for AI consulting firms in the Raleigh-Durham area"
"What healthcare companies in Charlotte have the best MX scores?"
"Show me companies similar to Product Hacker"
"Create a segment of upscale dining with strong web presence"

Profiles

"Create my OnlyData profile. I'm [name], [title] at [company] in [city]."
"Update my profile to add Python, React, and Supabase to my skills"
"Set my signals to open for advisory roles and consulting"
"Show me my current profile"

Data Upload

"Upload these 50 companies to OnlyData: [paste CSV or list]"
"Upload my prospect list and match against the business database"
"Show me my recent uploads and match results"

Agent Readiness

"Scan producthacker.ai for agent readiness"
"What's the agent readiness score for stripe.com?"
"Show me the top agent-ready companies in the database"

Analysis

"What email providers do Boise businesses use most?"
"How many B2B companies in Charlotte have enterprise MX security?"
"Find all McDonald's locations and show me their chain structure"
"Compare agent readiness between Boise and Charlotte restaurants"

Our Models

Every attribute is produced by a named, versioned enrichment model. View full model documentation with live stats →

agent_readiness_v2Website agent readiness scan (0-100)Railway
industry_v2Multi-pass NAICS/SIC classificationStu
mx_profile_v2Email infrastructure profilingRailway
description_v1Business description generationStu
size_v1Business size (solo/smb/enterprise)Stu
verify_v1Business verificationRailway
semantic_searchVector embeddings (384 dims)Both

Ask Cam & Jody

Have a question about the data, our models, or how to use the platform? Ask the founders directly.