api · v1

REST, webhooks, MCP.

Everything the app does, your code can do. Bearer tokens, JSON in and out, and an MCP server if you would rather drive it from an assistant.

base /api/v1 60 req/min Pro and up

28 endpoints · 13 groups · v1.1.0 · OpenAPI 3.0 spec (YAML)

authenticate
curl https://app.dealarena.io/api/v1/prospects \
  -H "Authorization: Bearer da_live_…"

Mint a token in Settings → API access. It is shown once.

identity 1 endpoint

Who am I — identity, tier, credits, XP, streak, token scopes

Works with ANY valid token (no scope required). Cheap; MCP clients call it for context.

curl https://app.dealarena.io/api/v1/me \
  -H "Authorization: Bearer da_live_…"
ResponseMeaning
200Caller identity
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token owner's tier is below the requirement (tier_required)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

prospects 6 endpoints

List/search prospects

curl https://app.dealarena.io/api/v1/prospects \
  -H "Authorization: Bearer da_live_…"
ParameterInDescription
q query ILIKE search over name/company/title/email
stage query Filter by pipeline stage key (alias: status)
limit query Page size. List requests over 10 items weigh ceil(limit/10) against the burst limit.
offset query
ResponseMeaning
200Prospect page
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

Create a prospect

curl -X POST https://app.dealarena.io/api/v1/prospects \
  -H "Authorization: Bearer da_live_…" \
  -H "Content-Type: application/json"
ResponseMeaning
201One prospect
400Bad input (validation_failed)
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

Bulk-create up to 100 prospects

Per-item results — failed rows are reported by index, valid rows are still created. Awards no XP (parity with CSV import).

curl -X POST https://app.dealarena.io/api/v1/prospects/bulk \
  -H "Authorization: Bearer da_live_…" \
  -H "Content-Type: application/json"
ResponseMeaning
201Per-item results
400Bad input (validation_failed)
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

Get one prospect

curl https://app.dealarena.io/api/v1/prospects/{pid} \
  -H "Authorization: Bearer da_live_…"
ResponseMeaning
200One prospect
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
404No such resource for this token's owner (not_found)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

Update prospect fields

curl -X PUT https://app.dealarena.io/api/v1/prospects/{pid} \
  -H "Authorization: Bearer da_live_…" \
  -H "Content-Type: application/json"
ResponseMeaning
200One prospect
400Bad input (validation_failed)
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
404No such resource for this token's owner (not_found)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

Move a prospect to the Trash (soft delete)

Sets `deleted_at` — the prospect lands in the in-app Trash (/database/trash), restores cleanly, and is hard-purged only by the 30-day worker. No API code path hard-deletes.

curl -X DELETE https://app.dealarena.io/api/v1/prospects/{pid} \
  -H "Authorization: Bearer da_live_…"
ResponseMeaning
200Trashed
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
404No such resource for this token's owner (not_found)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

deals 4 endpoints

Move a prospect through the pipeline

Same validation, XP award, activity log, and webhook emission as the UI kanban drag. Honors the tenant's custom pipeline stage keys; an invalid key returns `validation_failed` naming the valid keys.

curl -X PATCH https://app.dealarena.io/api/v1/prospects/{pid}/stage \
  -H "Authorization: Bearer da_live_…" \
  -H "Content-Type: application/json"
ParameterInDescription
pid * path
ResponseMeaning
200Stage moved
400Bad input (validation_failed)
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
404No such resource for this token's owner (not_found)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

List deals (prospects in deal-stage statuses)

curl https://app.dealarena.io/api/v1/deals \
  -H "Authorization: Bearer da_live_…"
ParameterInDescription
limit query Page size. List requests over 10 items weigh ceil(limit/10) against the burst limit.
offset query
ResponseMeaning
200Prospect page
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

Get one deal

curl https://app.dealarena.io/api/v1/deals/{pid} \
  -H "Authorization: Bearer da_live_…"
ResponseMeaning
200One prospect
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
404No such resource for this token's owner (not_found)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

Update deal fields

curl -X PUT https://app.dealarena.io/api/v1/deals/{pid} \
  -H "Authorization: Bearer da_live_…" \
  -H "Content-Type: application/json"
ResponseMeaning
200One prospect
400Bad input (validation_failed)
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
404No such resource for this token's owner (not_found)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

activities 1 endpoint

Log an activity (call / meeting / note / email)

Writes the identical `activity_log` row shape the UI writes, so profile feeds and the connected-call filter pick API rows up. Awards no XP (UI parity).

curl -X POST https://app.dealarena.io/api/v1/activities \
  -H "Authorization: Bearer da_live_…" \
  -H "Content-Type: application/json"
ResponseMeaning
201Logged
400Bad input (validation_failed)
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
404No such resource for this token's owner (not_found)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

tasks 3 endpoints

List my tasks

User-scoped (the token owner's tasks). The in-app list view is workspace-shared; this endpoint is deliberately "my tasks".

curl https://app.dealarena.io/api/v1/tasks \
  -H "Authorization: Bearer da_live_…"
ParameterInDescription
status query
due query
limit query Page size. List requests over 10 items weigh ceil(limit/10) against the burst limit.
offset query
ResponseMeaning
200Tasks
400Bad input (validation_failed)
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

Create a task

Awards the same `task_added` XP as the UI.

curl -X POST https://app.dealarena.io/api/v1/tasks \
  -H "Authorization: Bearer da_live_…" \
  -H "Content-Type: application/json"
ResponseMeaning
201Created
400Bad input (validation_failed)
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
404No such resource for this token's owner (not_found)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

Complete (or reopen) a task

`{"done": true}` completes; XP (`task_completed`) fires only on the open→completed transition — idempotent replays award nothing.

curl -X PATCH https://app.dealarena.io/api/v1/tasks/{task_id} \
  -H "Authorization: Bearer da_live_…" \
  -H "Content-Type: application/json"
ParameterInDescription
task_id * path
ResponseMeaning
200Updated
400Bad input (validation_failed)
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
404No such resource for this token's owner (not_found)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

analytics 1 endpoint

Pipeline summary — per-stage counts, TCV totals, deltas, stale callouts

curl https://app.dealarena.io/api/v1/pipeline/summary \
  -H "Authorization: Bearer da_live_…"
ParameterInDescription
period query
ResponseMeaning
200Summary
400Bad input (validation_failed)
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

outreach 1 endpoint

Draft outreach for a prospect (1 credit)

Charges exactly 1 credit through the same meter as the UI — token traffic gets zero discount. At zero credits returns 402 `credits_exhausted` and burns nothing. Output capped at 300 tokens.

curl -X POST https://app.dealarena.io/api/v1/outreach/draft \
  -H "Authorization: Bearer da_live_…" \
  -H "Content-Type: application/json"
ResponseMeaning
200Draft
400Bad input (validation_failed)
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
402Monthly credit allotment used up (credits_exhausted) — nothing was charged
403Token lacks the required scope (insufficient_scope)
404No such resource for this token's owner (not_found)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

companies 2 endpoints

List/search companies (accounts)

curl https://app.dealarena.io/api/v1/companies \
  -H "Authorization: Bearer da_live_…"
ParameterInDescription
q query ILIKE search over name/domain/normalized name
limit query Page size. List requests over 10 items weigh ceil(limit/10) against the burst limit.
offset query
ResponseMeaning
200Companies with prospect_count + total_deal_value aggregates
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

Get one company + its linked prospects

curl https://app.dealarena.io/api/v1/companies/{account_id} \
  -H "Authorization: Bearer da_live_…"
ParameterInDescription
account_id * path
ResponseMeaning
200Company with `prospects` array
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
404No such resource for this token's owner (not_found)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

sauce 1 endpoint

The Sauce — market/news signals + Daily Sauce Leads

`feed=market` (SEC/Polymarket events) · `feed=news` (GNews mentions) · `feed=leads` (latest Daily Sauce Leads snapshot).

curl https://app.dealarena.io/api/v1/sauce \
  -H "Authorization: Bearer da_live_…"
ParameterInDescription
feed query
limit query Page size. List requests over 10 items weigh ceil(limit/10) against the burst limit.
offset query
ResponseMeaning
200Feed payload (signals for market/news; snapshot for leads)
400Bad input (validation_failed)
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

sequences 2 endpoints

List my sequences

curl https://app.dealarena.io/api/v1/sequences \
  -H "Authorization: Bearer da_live_…"
ResponseMeaning
200Sequences (id, name, active, step_count)
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

Enroll a prospect in a sequence

Identical to in-app enrollment — tier gate (free tier is refused), solo cap, start-node resolution, executor signal, and the `sequence.enrolled` trigger. Re-enrolling an active enrollment returns `reused true`.

curl -X POST https://app.dealarena.io/api/v1/sequences/{sid}/enroll \
  -H "Authorization: Bearer da_live_…" \
  -H "Content-Type: application/json"
ParameterInDescription
sid * path
ResponseMeaning
200Already actively enrolled (reused)
201Enrolled
400Bad input (validation_failed)
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token owner's tier is below the requirement (tier_required)
404No such resource for this token's owner (not_found)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

agents 1 endpoint

Ask an agent (launch allowlist — legion, 5 credits)

BDM Legion is the first agent behind this endpoint. `context` may pin a `member_id`, `prospect_id`, or one of Legion's task types (research | draft_email | follow_up | objection_handling | call_prep); otherwise your first active member free-runs the prompt. An unknown agent returns `validation_failed` naming the available agents.

curl -X POST https://app.dealarena.io/api/v1/agents/ask \
  -H "Authorization: Bearer da_live_…" \
  -H "Content-Type: application/json"
ResponseMeaning
200Agent output
400Bad input (validation_failed)
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
402Monthly credit allotment used up (credits_exhausted) — nothing was charged
403Token lacks the required scope (insufficient_scope)
404No such resource for this token's owner (not_found)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

legion 2 endpoints

List Legion members

curl https://app.dealarena.io/api/v1/legion \
  -H "Authorization: Bearer da_live_…"
ResponseMeaning
200Members
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

Get one Legion member

curl https://app.dealarena.io/api/v1/legion/{mid} \
  -H "Authorization: Bearer da_live_…"
ParameterInDescription
mid * path
ResponseMeaning
200Member
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
404No such resource for this token's owner (not_found)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

webhooks 3 endpoints

List webhook subscriptions

curl https://app.dealarena.io/api/v1/webhooks \
  -H "Authorization: Bearer da_live_…"
ResponseMeaning
200Subscriptions
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

Create a webhook subscription

The signing `secret` is returned once at creation. Deliveries are signed `X-DealArena-Signature: t=...,v1=...` (HMAC-SHA256). The `url` must be `https://` on a publicly routable host. Private, loopback, link-local and cloud-metadata addresses are rejected at registration and again at delivery time, so a hostname that later resolves to one of them is dropped rather than delivered. Redirects are not followed — respond `2xx` at the URL you register.

curl -X POST https://app.dealarena.io/api/v1/webhooks \
  -H "Authorization: Bearer da_live_…" \
  -H "Content-Type: application/json"
ResponseMeaning
201Created (secret shown once)
400Bad input (validation_failed)
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded

Revoke a webhook subscription

curl -X DELETE https://app.dealarena.io/api/v1/webhooks/{wid} \
  -H "Authorization: Bearer da_live_…"
ParameterInDescription
wid * path
ResponseMeaning
200Revoked
401Missing/invalid/revoked token, or the owner account is deleted (auth_required)
403Token lacks the required scope (insufficient_scope)
404No such resource for this token's owner (not_found)
429Burst limit (rate_limited) or daily quota (quota_exceeded) exceeded
mcp

The MCP server exposes the same surface to assistants. Settings mints the token and assembles the config block for you, ready to paste.

Read the setup doc →
reference

REST API v1 for DealArena — drive your whole desk through /api/v1, or connect Claude through the DealArena MCP server (below).

Authentication

Every endpoint requires a bearer token minted in Settings › API Access (da_live_...). Tokens are scoped; each operation lists its required scope (x-required-scope). GET /me works with any valid token.

Envelope

Success: {"data": ..., "meta": {...}?} — list endpoints carry meta.limit / meta.offset / meta.total. Error: {"error": {"code": "<snake_code>", "message": "<human sentence>"}}. The nine codes in #/components/schemas/Error are the only error shapes the API emits.

Rate limits & quotas

Burst: 60 requests / 60s rolling per token (list endpoints weigh ceil(limit/10)), reported via X-RateLimit-*. Daily: a durable per-token quota (default 5,000/day Pro, 20,000/day Enterprise) that rolls at midnight UTC, reported via X-RateLimit-Daily-*. Exceeding either returns 429 (rate_limited vs quota_exceeded) with Retry-After.

Tier

The token owner's tier is resolved on every request. Below Pro → 403 tier_required. Credit-metered endpoints (/outreach/draft, /agents/ask) charge the same credits as the UI.

MCP Server

dealarena-mcp is an npm package that runs a local MCP (Model Context Protocol) server over this API, exposing 19 workflow tools to Claude Desktop, Claude Code, and any MCP client. Local stdio transport only: your token stays on your machine, and tier, scopes, and revocation are enforced server-side on every call.

Requirements

  • Node.js ≥ 18
  • A Pro account
  • An API token (da_live_...) minted in Settings › API Access

Connect

Claude Code:

claude mcp add dealarena -- npx dealarena-mcp

Claude Desktop, in claude_desktop_config.json:

{
  "mcpServers": {
    "dealarena": {
      "command": "npx",
      "args": ["dealarena-mcp"],
      "env": { "DEALARENA_API_KEY": "da_live_..." }
    }
  }
}

The server registers under the name dealarena.

Environment variables

Variable Required Default Notes
DEALARENA_API_KEY yes (none) Your da_live_... token from Settings › API Access
DEALARENA_API_URL no https://app.dealarena.io Non-localhost values must be HTTPS

Tools

Tool What it does Scope Notes
search_prospects Search prospects by query or stage prospects:read Read-only; up to 25 rows
get_prospect Fetch one prospect prospects:read Read-only
create_prospect Create a prospect prospects:write Name plus optional company, title, email, phone, LinkedIn, notes
create_prospects_bulk Bulk-create prospects prospects:write Up to 100 per call; per-row errors reported
update_prospect Update prospect fields prospects:write Idempotent
lookup_company Find a company by name or id companies:read Read-only
log_activity Log a call, meeting, note, or email activities:write Awards XP
move_deal_stage Move a deal through the pipeline deals:write Awards XP; shows in the UI immediately
list_my_tasks List your tasks tasks:read Read-only; filters: status, due
create_task Create a task tasks:write Optional due date and prospect link
complete_task Complete a task tasks:write Idempotent
trash_prospect Move a prospect to Trash prospects:write Recoverable: Trash only, no hard delete
draft_outreach Draft an email, LinkedIn message, or call opener outreach:write Costs 1 AI credit
list_sequences List your sequences sequences:read Read-only
enroll_in_sequence Enroll a prospect in a sequence sequences:write Caution: fires real outbound touches
get_pipeline_summary Per-stage counts, TCV, deltas analytics:read Read-only; period: 7d, 30d, or 90d
get_my_stats Identity, tier, credits, XP, streak any token Read-only
get_sauce_signals Sauce feed: market, news, or leads signals:read Read-only
ask_agent Ask the BDM Legion agent agents:invoke Costs 5 credits; agent: legion only

Behavior

Requests time out at 30s (60s for draft_outreach and ask_agent). One automatic retry on 429, honoring Retry-After. List tools cap at 25 rows. Errors surface this API's nine-code dialect (above) with fixed, human-readable messages. For reporting-only setups, mint a Read-only token in Settings › API Access.