API · SDK · MCP

Developers

Build on Sports Industry Data: a REST API, a typed JS/TS SDK and a Claude MCP server for sports sales intelligence — search, verify, enrich, Lead Queue, pipeline, signals and AI outreach drafts.

REST API v1
23 operations, JSON in and out
JS/TS SDK
Typed, zero dependencies, streaming drafts
Claude MCP
7 tools for Claude Desktop + Code
Start here

Quickstart

  1. 1
    Request access
    Create an account and request access. We review every request by hand; on approval your sid_live_… key arrives by email. It is shown once.
  2. 2
    Call the API
    Base URL https://sportsindustrydata.com/api/v1. Send Authorization: Bearer with your key.
  3. 3
    Or skip the HTTP
    Use the SDK in Node, or plug the MCP server into Claude.
first call
export SID_API_KEY=sid_live_YOUR_KEY
curl -s https://sportsindustrydata.com/api/v1/me -H "Authorization: Bearer $SID_API_KEY"
Security

Auth, rate limits & quotas

Headers

Authorization: Bearer sid_live_… (or x-api-key). Keys belong to your account and carry scopes. Revoke one any time; it stops at once.

readverifyenrichleadspipelinewebhooksvisitordraft
Limits
  • 60 requests / minute per key → X-RateLimit-Limit, X-RateLimit-Remaining; over it: 429 + Retry-After.
  • Monthly usage counts against your plan (API calls, verifications, drafts) → 402 quota_exceeded. Check with GET /me.
  • Errors are always { error: { code, message } }.
Guardrails built in. People marked dnc (suppressed, opted out, or under 18) are never drafted to. LinkedIn URLs come only from users or data partners, never scraping. Private household data is never exposed through the API or MCP.
Reference

Endpoints

Generated from the live spec. * = required. Full schemas and examples: /api/v1/openapi.json.

Account
MethodPathWhat it doesParams / body
GET/me
Your key, account and this month's usage
—
GET/openapi.json
This document
—
Search
MethodPathWhat it doesParams / body
GET/orgs
Search organisations
Agencies, brands, marketing firms, financial firms and foundations. Warm paths first: orgs where your account already knows people rank first.
?q ?track ?kind ?limit ?offset
GET/orgs/{id}
Get one organisation
—
GET/people
Search people
Contacts, athletes, agents, advisors and foundation executives. People in your rolodex come first.
?q ?org_id ?kind ?limit ?offset
GET/people/{id}
Get one person
—
Verify & enrich
MethodPathWhat it doesParams / body
POST/verify
Verify an email before you send
Syntax, MX, disposable/role checks, suppression list, and — when the address belongs to a known person — whether they are still at that employer. Counts against the `verifies` limit. Scope: verify.
email* person_id
POST/enrich
Enrich by domain or by email
Send `{domain}` for the org, its email pattern and known people, or `{email}` for the person behind it. Returns email, title, LinkedIn and company only. Scope: enrich.
domain* | email*
Lead Queue
MethodPathWhat it doesParams / body
GET/leads
List the Lead Queue
?status ?limit ?offset
POST/leads
Add a lead to the queue
Creates a `queued` row. Nothing enters the pipeline automatically — a person approves it. Scope: leads.
title* person_id org_id reason
GET/leads/{id}
Get a lead
—
PATCH/leads/{id}
Update a lead (approve, reject, assign)
status assigned_to reason
DELETE/leads/{id}
Delete a lead
—
Pipeline
MethodPathWhat it doesParams / body
GET/pipeline
Pipeline summary + deals
—
POST/pipeline/deals
Create a deal
name* org_id person_id lead_id pipeline stage value_cents
PATCH/pipeline/deals/{id}
Move or update a deal
stage value_cents name expected_close
Signals & webhooks
MethodPathWhat it doesParams / body
GET/signals
Recent signals
Job changes, agency changes, signings, foundation news and identified visitors.
?kind ?since ?limit
GET/webhooks
List webhook subscriptions
—
POST/webhooks
Subscribe a URL to events
url* events*
DELETE/webhooks/{id}
Delete a webhook
—
Visitor intel
MethodPathWhat it doesParams / body
GET/visitor-events
Recent identified visits
?limit
POST/visitor-events
Identify a visitor from your server
Send the visitor's IP (from your own server) to identify the company/person. Matches create a queued lead. Scope: visitor.
ip* url referrer site_key
Outreach
MethodPathWhat it doesParams / body
POST/draft
AI-draft personalised outreach
Uses career history, company news, call transcripts, email threads and rolodex status. Add `?stream=1` for a text/plain stream. Never drafts to do-not-contact people or minors. Scope: draft.
?stream person_id* channel* goal tone notes
Copy & paste

Three calls to try

1 · search tier-1 agencies
curl -s "https://sportsindustrydata.com/api/v1/orgs?q=sports&tier=1&track=Agency&limit=5" \
  -H "Authorization: Bearer $SID_API_KEY"
response
{
  "data": [
    { "id": 12, "name": "Bluehollow Talent Group", "track": "Agency", "tier": "1",
      "domain": "northline.example", "domain_confidence": "HIGH",
      "people_count": 4, "known_count": 1, "warm_path": true }
  ],
  "meta": { "total": 1, "limit": 5, "offset": 0 }
}
2 · verify before you send
curl -s -X POST https://sportsindustrydata.com/api/v1/verify \
  -H "Authorization: Bearer $SID_API_KEY" \
  -H "content-type: application/json" \
  -d '{"email":"jordan.avery@example.com"}'
3 · queue a lead (a person approves it)
curl -s -X POST https://sportsindustrydata.com/api/v1/leads \
  -H "Authorization: Bearer $SID_API_KEY" \
  -H "content-type: application/json" \
  -d '{"title":"Bluehollow Foundation — intro","org_id":7,"reason":"Warm path"}'
@sportsindustrydata/sdk

JS / TS SDK

Typed, zero dependencies, Node 18+. Retries 429/5xx with back-off, throws SIDError with a code, and streams drafts with draftStream().

install
npm i ./sportsindustrydata-sdk-1.0.1.tgz     # today (tarball)
npm i @sportsindustrydata/sdk                 # once published
example.ts
import { SID } from "@sportsindustrydata/sdk";

const sid = new SID({ apiKey: process.env.SID_API_KEY! });

// 1. Who do we already know at Bluehollow Talent Group?
const { data: orgs } = await sid.orgs.search({ q: "Bluehollow" });
const org = await sid.orgs.get(orgs[0].id);
const known = org.people.filter((p) => p.known);

// 2. Verify before you send
const v = await sid.verify(known[0].email!, known[0].id);

// 3. Stream an AI draft
for await (const chunk of sid.draftStream({ person_id: known[0].id, channel: "email", goal: "Introduce our athlete-partnership program and ask for 15 minutes" }))
  process.stdout.write(chunk);
Model Context Protocol

Use it from Claude

The MCP server runs on your machine and calls the API with your key. Tools:

search_orgssearch_peopleget_personverify_emaildraft_outreachadd_to_lead_queuepipeline_summary
Claude Desktop · claude_desktop_config.json
{
  "mcpServers": {
    "sports-industry-data": {
      "command": "sid-mcp",
      "env": { "SID_API_KEY": "sid_live_YOUR_KEY" }
    }
  }
}
Claude Code
npm i -g ./sportsindustrydata-mcp-1.0.1.tgz
claude mcp add sports-industry-data -e SID_API_KEY=sid_live_YOUR_KEY -- sid-mcp

Then ask Claude: “Who do we already know at Bluehollow Talent Group? Verify their email and draft a short intro about our athlete-partnership program.”

Push, not poll

Webhooks

Subscribe a URL with POST /webhooks. Each delivery is POST {event, data, sent_at}, signed with the secret you get once at creation.

signal.firedlead.createdlead.approveddeal.movedoutreach.repliedvisitor.identified
verify the signature (Express)
import { verifyWebhookSignature } from "@sportsindustrydata/sdk/webhooks";

// X-SID-Signature: sha256=<hex HMAC-SHA256(secret, raw body)>
app.post("/sid-hook", express.raw({ type: "application/json" }), (req, res) => {
  if (!verifyWebhookSignature(process.env.SID_WEBHOOK_SECRET, req.body, req.get("x-sid-signature")))
    return res.status(401).end();
  const { event, data, sent_at } = JSON.parse(req.body.toString());
  // event: signal.fired | lead.created | lead.approved | deal.moved | outreach.replied | visitor.identified
  res.sendStatus(200);
});
Your website

Embed widget + visitor pixel

Get your site key in the app under Visitor intel. The embed adds a styled request form (or a floating button) and the pixel; the pixel alone identifies visiting companies and people into your Lead Queue for a person to approve.

embed (form + pixel)
<!-- Request form + visitor pixel. Put <div id="sid-embed"></div> where the form should go,
     or leave it out for a floating "Talk to Sports Industry Data" button. -->
<script src="https://sportsindustrydata.com/api/sid/embed.js"
        data-site="YOUR_SITE_KEY" data-form="1" async></script>
pixel only
<!-- Visitor intel only: identifies visiting companies and people into your Lead Queue -->
<script src="https://sportsindustrydata.com/api/sid/px.js?k=YOUR_SITE_KEY" async></script>
Ready to build?
Access is by request: create an account, tell us what you are building, and we review it by hand.
Developers · Sports Industry Data