Developers
Build on the TAP API, MCP server, and webhooks
The TAP developer surface is a 38-endpoint REST API, a 45-tool MCP server, signed webhooks, and a published OpenAPI spec, all scoped to your workspace and authenticated with scoped API keys.
TAP now has more than a static API page. The public API, MCP server, transcript hub, and assistant layer are becoming one developer surface. Use this page to find what is shipped now and what is still only foundation work.
Building an integration for TAP? This page is for you. Connecting the agent you already use to your TAP workspace is a different job, and has its own page.
REST API
Ship contact, campaign, webhook, and transcript flows from the same surface your operators use.
MCP Server
Give agents first-class access to campaign memory, action queues, and pitch tooling without scraping the UI.
Transcript Hub
Route Meet, Zoom, Granola, Drive, and manual transcripts into one canonical memory layer.
Radio Plays Bridge
Import deduplicated, WARM-backed radio plays through the radio import route.
Explorer
Explore the live surface area
Search the shipped API, MCP tooling, examples, and machine-readable endpoints from one place. This is the fastest way to figure out what is ready now versus what still belongs in roadmap copy.
Browse workspace, contact, and release endpoints.
27 matches
Contacts
GET/api/v1/contactsList contacts with pagination and search
contacts:readPOST/api/v1/contactsImport up to 500 contacts with validation
contacts:writeGET/api/v1/contacts/{id}Get a single contact with full details
contacts:readDELETE/api/v1/contacts/{id}GDPR-compliant contact erasure
contacts:writePOST/api/v1/contacts/validateBatch email validation (up to 100)
validatePOST/api/v1/contacts/enrichAI enrichment with 14 data points per contact
enrichCampaigns
GET/api/v1/campaignsList campaigns with status and artist filters
campaigns:readPOST/api/v1/campaignsCreate a new PR campaign
campaigns:writeGET/api/v1/campaigns/{id}Get campaign details with stats
campaigns:readPATCH/api/v1/campaigns/{id}Update campaign fields
campaigns:writeGET/api/v1/campaigns/{id}/contactsList contacts linked to a campaign
campaigns:readPOST/api/v1/campaigns/{id}/contactsAdd up to 200 contacts to a campaign
campaigns:writeGET/api/v1/campaigns/{id}/pitchesList pitch drafts for a campaign
campaigns:readPOST/api/v1/campaigns/{id}/pitchesGenerate AI pitch drafts
campaigns:writeGET/api/v1/campaigns/{id}/outcomesList outcomes for a campaign
campaigns:readPOST/api/v1/campaigns/{id}/outcomesLog an outcome against a campaign contact
campaigns:writeOutcomes
GET/api/v1/outcomesList outcomes with campaign/contact filters
campaigns:readPOST/api/v1/outcomesLog a campaign outcome
campaigns:writeGET/api/v1/outcomes/{id}Get a single outcome record
campaigns:readPATCH/api/v1/outcomes/{id}Update an outcome record
campaigns:writeWorkspace
GET/api/v1/actionsGet prioritised action queue for active campaigns
campaigns:readGET/api/v1/webhooksList registered webhooks
webhooks:readPOST/api/v1/webhooksRegister a webhook endpoint
webhooks:writeDELETE/api/v1/webhooks/{id}Remove a webhook registration
webhooks:writeGET/api/v1/keysList API keys for your workspace
sessionPOST/api/v1/keysGenerate a new API key
sessionDELETE/api/v1/keysRevoke an API key
sessionNeed the workflow layer, transcript adapters, or the monitoring bridge mapped out first? Start with the machine-readable docs and the shipped routes on this page.
Open OpenAPIScoped keys
Issue a key, scope it, hand it to your agent
Every API key on TAP is workspace-bound and scope-limited. Keys are stored as SHA-256 hashes only. Issue, rotate, and revoke from /settings/api-keys inside the workspace. The plaintext key is shown once at creation.
Create a key
Available scopes: contacts:read, contacts:write, releases:read, releases:write, pitches:write, skills:write, approvals:read, enrich, validate.
# Issue from the workspace UI (recommended)
# /settings/api-keys -> "Create key"
# Name: Agent Production
# Scopes: contacts:read, releases:read, pitches:write
# Expires: 90 days (rotate before expiry)
# Returned format (shown once):
# tap_ak_live_1a2b3c4d5e6f...
# Use as Bearer token on every request:
curl https://totalaudiopromo.com/api/v1/campaigns \
-H "Authorization: Bearer $TAP_API_KEY"Scope enforcement
Requests without a permitted scope return 403 with a structured error identifying the missing scope.
# Example: key with only contacts:read
curl -X POST https://totalaudiopromo.com/api/v1/contacts \
-H "Authorization: Bearer $TAP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]"}'
# 403 Forbidden
# {
# "error": "scope_missing",
# "required_scope": "contacts:write",
# "key_scopes": ["contacts:read"]
# }Scoped keys are available with a release pack. See what's included.
MCP server
Install `tap-mcp` once. Drive the workspace from any agent.
The TAP MCP server exposes the same surface a human operator uses, scoped to your workspace. Works with Claude Desktop, Cursor, Continue, and any Model Context Protocol client. Auth is the same scoped key issued above.
One-command install
Published to npm. No clone, no build.
# Run on demand
npx -y @totalaudiopromo/tap-mcp@latest
# Or install globally
npm install -g @totalaudiopromo/tap-mcp
# Required env
export TAP_API_KEY="tap_ak_live_..."
export TAP_WORKSPACE_ID="ws_..." # optional, defaults to key's workspaceClaude Desktop config
Add to ~/Library/Application Support/Claude/claude_desktop_config.json on macOS.
{
"mcpServers": {
"tap": {
"command": "npx",
"args": ["-y", "@totalaudiopromo/tap-mcp@latest"],
"env": {
"TAP_API_KEY": "tap_ak_live_..."
}
}
}
}Full tool list (30+ tools across releases, contacts, pitches, analysis) lives in the npm package README. MCP server install is available with a release pack.
Skills
House rules an agent can read before it acts
Skills are the workspace’s editable house rules. Fork the default seed, edit the body, diff against the seed, and version it. Every release agent reads the Skills before it drafts a single pitch.
Drive skills from your agent
Fork, run, and inspect over MCP or REST. UI editor lives at /settings/skills.
# List skills in the workspace (MCP)
tap_list_skills
# Fork the seed into an editable workspace copy
tap_fork_skill { "slug": "contact-research" }
# Run it, output queues for review, never sends
tap_run_skill { "slug": "contact-research", "input": { "campaign_id": "…" } }
# Same over REST
GET /api/v1/skills
POST /api/v1/skills/contact-research/runAgent discovery endpoint
Public well-known endpoint advertises the workspace skills surface to any client.
curl https://totalaudiopromo.com/.well-known/agent-skills
# 200 OK
# {
# "$schema": "https://agentskills.io/schemas/v0.2.0/index.json",
# "skills": [
# { "name": "contact-enrichment", "type": "instructions",
# "url": ".../agent-skills/contact-enrichment/SKILL.md",
# "sha256": "…" },
# …
# ]
# }Webhooks
Push release and pitch events to your stack
Subscribe a URL to release, pitch, and coverage events. Signed payloads, retry on 5xx, configurable per workspace. Manage from /settings/webhooks.
Example payload
Verify the X-TAP-Signature header against your endpoint secret before trusting the payload.
POST /your-endpoint
Content-Type: application/json
X-TAP-Signature: t=<unix-ts>,v1=<hex hmac-sha256 of "<ts>.<body>">
X-TAP-Event: pitch.replied
{
"event": "pitch.replied",
"workspace_id": "ws_...",
"data": {
"pitch_id": "p_...",
"contact_id": "c_...",
"campaign_id": "cmp_...",
"reply_classification": "positive",
"received_at": "2026-05-16T10:42:00Z"
}
}Webhook events: release.created, pitch.sent, pitch.replied, pitch.bounced, coverage.logged. Webhook subscriptions are available with a release pack.
Included in a release pack
Drive your workspace from anywhere
A release pack opens the doors, so the same workspace can be driven by an agent or by your own scripts as well as through the app. Scoped API keys, MCP server install, webhooks, the skill editor with version history, and the journalist and radio database.
Quick start
Start from the common workflows
These are the routes that matter first: getting data in, creating releases, giving agents access, and importing WARM-backed radio plays.
List contacts
Fetch the first 10 matching contacts from the REST API.
curl -H "Authorization: Bearer tap_ak_your_key" \
"https://totalaudiopromo.com/api/v1/contacts?limit=10&search=BBC"Create a campaign
Open a draft campaign and start attaching assets and contacts.
curl -X POST \
-H "Authorization: Bearer tap_ak_your_key" \
-H "Content-Type: application/json" \
-d '{"name":"Spring Release","artist_name":"Artist Name"}' \
"https://totalaudiopromo.com/api/v1/campaigns"Ingest a transcript
Send Google Meet, Zoom, Granola, or manual transcript text into TAP.
curl -X POST \
-H "Authorization: Bearer tap_ak_your_key" \
-H "Content-Type: application/json" \
-d '{"source":"granola","project_id":"<campaign-id>","raw_text":"Call transcript..."}' \
"https://totalaudiopromo.com/api/transcripts/ingest"Bridge in WARM plays
Import deduplicated bridge plays while Monitor is still coming online.
curl -X POST \
-H "Authorization: Bearer tap_ak_your_key" \
-H "Content-Type: application/json" \
-d '{"project_id":"<campaign-id>","source":"warm","plays":[{"station_name":"Amazing Radio","play_date":"2026-04-16"}]}' \
"https://totalaudiopromo.com/api/radio/import"Machine-readable
Pull the metadata directly
The docs matter, but agents and internal tools should prefer the machine-readable assets that are already available.
One surface for releases, contacts, and radio plays.
TAP already lets you ingest transcripts, operate releases, and bring in WARM-backed radio plays through the same API, MCP server, and webhooks your operators use.