Developers
Build on the workflows already compounding inside TAP
TAP now has more than a static API page. The public API, MCP server, transcript hub, assistant layer, and monitoring bridge are becoming one developer surface. Use this page to find what is shipped now and what is still only foundation work.
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.
Monitor Bridge
Use WARM-backed imports now while Monitor is validated as the native replacement.
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 campaign endpoints.
28 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:writeRelease briefs
POST/api/v1/release-briefsReceive an inbound release brief from a label partner. Idempotent on source_brief_id.
briefs:writePOST/api/v1/release-briefs/{id}/acceptAccept a pending brief; creates a campaign
sessionPOST/api/v1/release-briefs/{id}/declineDecline a pending brief
sessionWorkspace
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, campaigns:read, campaigns:write, pitches:write, monitor:read, enrich, validate.
# Issue from the workspace UI (recommended)
# /settings/api-keys -> "Create key"
# Name: Agent Production
# Scopes: contacts:read, campaigns: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 an Agency-tier capability. See Agency unlocks.
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 campaigns, contacts, pitches, monitor, analysis) lives in the npm package README. MCP server install is an Agency-tier capability.
Skills
House rules an agent can read before it acts
Skills are the agency’s editable house rules. Fork the default seed, edit the body, diff against the seed, and version it. Every campaign agent reads the Skills before it drafts a single pitch.
CLI flow
Edit, diff, and publish from a terminal. UI editor lives at /settings/skills.
# Install the CLI
npm install -g @totalaudiopromo/tap-cli
# List skills in the workspace
tap skill list
# Open a skill in your editor
tap skill edit liberty-radio
# Diff your working copy against the seed
tap skill diff liberty-radio
# Publish a new version (versioned, reversible)
tap skill publish liberty-radio --note "tighten follow-up cadence to T+7"Agent discovery endpoint
Public well-known endpoint advertises the workspace skills surface to any client.
curl https://totalaudiopromo.com/.well-known/agent-skills
# 200 OK
# {
# "version": "1",
# "mcp_server": "@totalaudiopromo/tap-mcp",
# "openapi": "/api/openapi.json",
# "skill_index": "/api/v1/skills",
# "scopes_required": ["skills:read", "skills:write"]
# }Webhooks
Push campaign and pitch events to your stack
Subscribe a URL to campaign, 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: sha256=...
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: campaign.created, pitch.sent, pitch.replied, pitch.bounced, coverage.logged, monitor.play_detected. Webhook subscriptions are Agency-tier.
Agency tier
The agent surface unlocks at Agency
Free and Pro run the workspace. Agency opens the doors so the same workspace can be driven by an agent, by your own scripts, or by a teammate. Skill editor with version history, scoped API keys, MCP server install, webhooks, journalist + radio database fork, Monitor metered access.
Quick start
Start from the common workflows
These are the routes that matter first: getting data in, creating campaigns, giving agents access, and bridging monitoring while the native stack matures.
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.
Build with the bridge now. Be ready for the replacement later.
TAP already lets you ingest transcripts, operate campaigns, and bridge WARM-backed monitoring into the product. The native Monitor stack is being laid under the same roof instead of off to the side.