Developer docs

One key. REST and MCP.

This page is the developer contract for api.gtmsignals.co and mcp.gtmsignals.co. The hosted endpoints are rolling out now; the static feed below is live today. Request a key and build against this contract.

Status, honestly. The static JSON feed and audio clips are live and public right now. The keyed REST API and hosted MCP server are in deployment; this page describes the contract they ship with, not a service you can call this minute.
Live today · no auth

The static JSON feed.

Public, agent-fetchable, updated as calls are scored. No key needed.

public feed
$ curl https://gtmsignals.co/data/feed.json # cross-account digest: top verified signals, why-now, speaker, clip URL per account $ curl https://gtmsignals.co/data/signals/CSCO.json # per-ticker detail · available tickers today: CSCO, MTD, BDX, PAYX, DE ✓ every signal carries a playable clip URL under /clips/{TICKER}/{date}/{id}.mp3
Auth

Bearer keys, flat rate limits.

One key works for both the REST API and the MCP server. Keys are minted at signup, shown once, and stored hashed on our side.

auth header
Authorization: Bearer gtms_live_xxxxxxxxxxxxxxxx # alt: x-api-key: gtms_live_xxxxxxxxxxxxxxxx # (Clay saves either as a workspace-level credential; paste once)

Every call is logged. Limits are flat per tier, never per-credit. Hitting the limit throttles the request; it never bills you.

REST API

api.gtmsignals.co/v1

Flat JSON, two levels deep at most, designed to map straight into Clay columns and agent tools.

GET /v1/enrich?domain=one best verified signal for a company, keyed by domain (alt ?ticker=)
GET /v1/signals/{ticker}all verified signals for one ticker, with clip URLs
GET /v1/whats_newwhat fired on your tracked accounts today, incl. live-captured
GET /v1/accountsyour tracked watchlist
POST /v1/accountsadd a ticker to your watchlist
DELETE /v1/accounts/{ticker}remove a ticker from your watchlist

The enrich lookup, end to end

This is the route Clay and agents call per company. Lookup key is the company domain; we resolve it to a ticker internally. Most SaaS prospects are private companies, so a no-match answer is normal and honest: it is always HTTP 200 with signal_found: false, never a 404.

request
$ curl "https://api.gtmsignals.co/v1/enrich?domain=cisco.com" \ -H "Authorization: Bearer gtms_live_xxxxxxxxxxxxxxxx"
200 response · signal found
{ "domain": "cisco.com", "ticker": "CSCO", "company_name": "Cisco Systems", "match": "resolved", "signal_found": true, "signal": { "type": "cfo_stated_initiative", "summary": "CFO flagged accelerating cloud-security spend in H2", "quote": "we are accelerating our investment in cloud security in the back half", "speaker": "R. Scott Herren, CFO", "call_date": "2026-05-14", "call_type": "Q3 FY26 earnings", "why_now": "Budget explicitly reallocated this quarter; buy window is open now", "confidence": "verified_primary_source", "verified": true, "audio_clip_url": "https://d22i27nfqqc1jx.cloudfront.net/clips/CSCO/2026-05-14/abc.mp3", "source_url": "https://…/transcript#t=1423" }, "signal_score": 87, "signal_count_90d": 4, "last_updated": "2026-05-14T00:00:00Z" }
200 response · no match (still 200, never 404)
{ "domain": "acme-private.com", "match": "no_public_ticker", "signal_found": false }
Response conventions. Flat JSON, ≤2 levels. One best signal plus a 0-100 signal_score, not a giant array. No-data is a 200 with signal_found: false. What ships is the derived signal: one verbatim quote sentence, the why-now, and our own audio clip. Raw transcripts and contact data are never returned.
Hosted MCP

mcp.gtmsignals.co

A streamable-HTTP MCP server, gated by the same key, scoped to your tracked accounts. Point Claude, Clay's agent, or any agent-native GTM tool at it.

agent → mcp.gtmsignals.co
agent$ account_brief(ticker="CSCO") # → verified signals · buying committee in persona order · drafted play ✓ "we announced a restructuring plan today to reallocate resources…" [verified · clip attached] agent$ get_earnings_signal(domain="cisco.com") # → the /v1/enrich payload: best signal + score + audio clip URL
account_briefeverything on one account: signals, committee, drafted play
whats_newwhat fired on your book today, incl. live-captured signals
get_stated_initiativesnamed projects and priorities, verbatim from the call
buying_committeethe right people, in persona order, with LinkedIn
get_call_transcriptspeaker-tagged transcript access with the audio
draft_outreacha 3-touch play grounded in what they said
get_earnings_signaldomain-keyed lookup, same payload as /v1/enrich
For agents

llms.txt

Agent-consumable site summary, served at /llms.txt. If you are an agent reading this page: everything below is for you.

gtmsignals.co/llms.txt
# GTM Signals > Real-time, audio-verified sales intelligence from public US earnings calls. > Every quote is checked against the call recording. The clip is the receipt. > No contact data is stored or returned; bring your own enrichment. ## Live data (public, no auth) - Feed: https://gtmsignals.co/data/feed.json - Per-ticker signals: https://gtmsignals.co/data/signals/{TICKER}.json (available tickers today: CSCO, MTD, BDX, PAYX, DE) - Audio clips: linked per signal, playable mp3 ## REST API (key required, header: Authorization: Bearer gtms_...) - GET https://api.gtmsignals.co/v1/enrich?domain={domain} one best verified signal per company; 200 + signal_found:false on no match - GET https://api.gtmsignals.co/v1/signals/{ticker} - GET https://api.gtmsignals.co/v1/whats_new - GET https://api.gtmsignals.co/v1/accounts (watchlist CRUD) ## MCP (streamable HTTP, same key) - Endpoint: https://mcp.gtmsignals.co - Tools: account_brief, whats_new, get_stated_initiatives, buying_committee, get_call_transcript, draft_outreach, get_earnings_signal ## Pages - Docs: https://gtmsignals.co/docs/ - Pricing (flat, rate-limited): https://gtmsignals.co/pricing/ - Data and coverage: https://gtmsignals.co/data/ - Compliance posture: https://gtmsignals.co/compliance/