Skip to main content
Skip to content
TAPTry TAP free

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/contacts

List contacts with pagination and search

contacts:read
POST
/api/v1/contacts

Import up to 500 contacts with validation

contacts:write
GET
/api/v1/contacts/{id}

Get a single contact with full details

contacts:read
DELETE
/api/v1/contacts/{id}

GDPR-compliant contact erasure

contacts:write
POST
/api/v1/contacts/validate

Batch email validation (up to 100)

validate
POST
/api/v1/contacts/enrich

AI enrichment with 14 data points per contact

enrich

Campaigns

GET
/api/v1/campaigns

List campaigns with status and artist filters

campaigns:read
POST
/api/v1/campaigns

Create a new PR campaign

campaigns:write
GET
/api/v1/campaigns/{id}

Get campaign details with stats

campaigns:read
PATCH
/api/v1/campaigns/{id}

Update campaign fields

campaigns:write
GET
/api/v1/campaigns/{id}/contacts

List contacts linked to a campaign

campaigns:read
POST
/api/v1/campaigns/{id}/contacts

Add up to 200 contacts to a campaign

campaigns:write
GET
/api/v1/campaigns/{id}/pitches

List pitch drafts for a campaign

campaigns:read
POST
/api/v1/campaigns/{id}/pitches

Generate AI pitch drafts

campaigns:write
GET
/api/v1/campaigns/{id}/outcomes

List outcomes for a campaign

campaigns:read
POST
/api/v1/campaigns/{id}/outcomes

Log an outcome against a campaign contact

campaigns:write

Outcomes

GET
/api/v1/outcomes

List outcomes with campaign/contact filters

campaigns:read
POST
/api/v1/outcomes

Log a campaign outcome

campaigns:write

Release briefs

POST
/api/v1/release-briefs

Receive an inbound release brief from a label partner. Idempotent on source_brief_id.

briefs:write
POST
/api/v1/release-briefs/{id}/accept

Accept a pending brief; creates a campaign

session
POST
/api/v1/release-briefs/{id}/decline

Decline a pending brief

session

Workspace

GET
/api/v1/actions

Get prioritised action queue for active campaigns

campaigns:read
GET
/api/v1/webhooks

List registered webhooks

webhooks:read
POST
/api/v1/webhooks

Register a webhook endpoint

webhooks:write
DELETE
/api/v1/webhooks/{id}

Remove a webhook registration

webhooks:write
GET
/api/v1/keys

List API keys for your workspace

session
POST
/api/v1/keys

Generate a new API key

session
DELETE
/api/v1/keys

Revoke an API key

session

Need 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 OpenAPI

Scoped 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 workspace

Claude 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"

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.