Skip to content

API reference

API: Competitive intelligence

Markdown version

MethodPathWhat it doesScope
POST/v1/battlecard-proposals/:id/approveApprove a battlecard edit (optionally with your changes): a new version, kept with its provenance (owners, from the app) (web app only)settings:write
POST/v1/battlecard-proposals/:id/rejectReject a battlecard edit (web app only)settings:write
GET/v1/competitor-refreshWhether a refresh is queued or runningknowledge:read
GET/v1/competitor-statsWin/loss per competitor: win rate, cycle length, loss reasons and segments, with sample sizesknowledge:read
GET/v1/competitorsTracked competitors with their recent changes, mentions, open battlecard edits and win/lossknowledge:read
POST/v1/competitorsTrack a competitor: name, aliases (as buyers say it) and its own domainsknowledge:write
DELETE/v1/competitors/:idStop tracking a competitor (its history stays)knowledge:write
GET/v1/competitors/:idOne competitor: pages, change log, mentions, battlecard, proposed edits, versions and win/lossknowledge:read
PATCH/v1/competitors/:idChange a competitor's name, aliases, domains or notesknowledge:write
POST/v1/competitors/:id/battlecard/proposalsPropose your own edit to a battlecard section (it's approved like any other) (web app only)knowledge:write
POST/v1/competitors/:id/battlecard/proposePropose battlecard edits now from page changes and active-evaluation mentions not used yet (each waits for approval)knowledge:write
GET/v1/competitors/:id/battlecard/versions/:versionOne approved battlecard version with its provenanceknowledge:read
POST/v1/competitors/:id/checkRead the competitor's monitored pages now: a change is logged with its diff, and battlecard edits are proposed from itknowledge:write
POST/v1/competitors/:id/pagesMonitor a public page on the competitor's own domain (pricing, release notes…; no query strings)knowledge:write
DELETE/v1/competitors/:id/pages/:pageStop monitoring a page (its change log stays until the competitor is removed)knowledge:write
POST/v1/competitors/refreshThe monthly pass in the background now: pages, mentions and battlecard proposals for every competitor (at most every 10 minutes; poll the list)knowledge:write
POST/v1/competitors/scan-mentionsLook for competitor mentions in the last N days of conversations, notes and emails (open deals' owners are told about new ones)knowledge:write

Examples

GET /v1/competitor-refresh

Whether a refresh is queued or running

curl -s "https://api.closefinch.com/v1/competitor-refresh" \
  -H "Authorization: Bearer $RA_API_KEY"
const res = await fetch(`https://api.closefinch.com/v1/competitor-refresh`, {
  method: "GET",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}` },
});
const data = await res.json();

GET /v1/competitor-stats

Win/loss per competitor: win rate, cycle length, loss reasons and segments, with sample sizes

curl -s "https://api.closefinch.com/v1/competitor-stats" \
  -H "Authorization: Bearer $RA_API_KEY"
const res = await fetch(`https://api.closefinch.com/v1/competitor-stats`, {
  method: "GET",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}` },
});
const data = await res.json();

GET /v1/competitors

Tracked competitors with their recent changes, mentions, open battlecard edits and win/loss

curl -s "https://api.closefinch.com/v1/competitors" \
  -H "Authorization: Bearer $RA_API_KEY"
const res = await fetch(`https://api.closefinch.com/v1/competitors`, {
  method: "GET",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}` },
});
const data = await res.json();

POST /v1/competitors

Track a competitor: name, aliases (as buyers say it) and its own domains

curl -s -X POST "https://api.closefinch.com/v1/competitors" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/competitors`, {
  method: "POST",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}`, "content-type": "application/json" },
  body: JSON.stringify({}), // fields: see the OpenAPI schema
});
const data = await res.json();

DELETE /v1/competitors/$ID

Stop tracking a competitor (its history stays)

curl -s -X DELETE "https://api.closefinch.com/v1/competitors/$ID" \
  -H "Authorization: Bearer $RA_API_KEY"
const res = await fetch(`https://api.closefinch.com/v1/competitors/${id}`, {
  method: "DELETE",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}` },
});
const data = await res.json();

GET /v1/competitors/$ID

One competitor: pages, change log, mentions, battlecard, proposed edits, versions and win/loss

curl -s "https://api.closefinch.com/v1/competitors/$ID" \
  -H "Authorization: Bearer $RA_API_KEY"
const res = await fetch(`https://api.closefinch.com/v1/competitors/${id}`, {
  method: "GET",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}` },
});
const data = await res.json();

PATCH /v1/competitors/$ID

Change a competitor's name, aliases, domains or notes

curl -s -X PATCH "https://api.closefinch.com/v1/competitors/$ID" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/competitors/${id}`, {
  method: "PATCH",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}`, "content-type": "application/json" },
  body: JSON.stringify({}), // fields: see the OpenAPI schema
});
const data = await res.json();

POST /v1/competitors/$ID/battlecard/propose

Propose battlecard edits now from page changes and active-evaluation mentions not used yet (each waits for approval)

curl -s -X POST "https://api.closefinch.com/v1/competitors/$ID/battlecard/propose" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/competitors/${id}/battlecard/propose`, {
  method: "POST",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}`, "content-type": "application/json" },
  body: JSON.stringify({}), // fields: see the OpenAPI schema
});
const data = await res.json();

GET /v1/competitors/$ID/battlecard/versions/$VERSION

One approved battlecard version with its provenance

curl -s "https://api.closefinch.com/v1/competitors/$ID/battlecard/versions/$VERSION" \
  -H "Authorization: Bearer $RA_API_KEY"
const res = await fetch(`https://api.closefinch.com/v1/competitors/${id}/battlecard/versions/${version}`, {
  method: "GET",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}` },
});
const data = await res.json();

POST /v1/competitors/$ID/check

Read the competitor's monitored pages now: a change is logged with its diff, and battlecard edits are proposed from it

curl -s -X POST "https://api.closefinch.com/v1/competitors/$ID/check" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/competitors/${id}/check`, {
  method: "POST",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}`, "content-type": "application/json" },
  body: JSON.stringify({}), // fields: see the OpenAPI schema
});
const data = await res.json();

POST /v1/competitors/$ID/pages

Monitor a public page on the competitor's own domain (pricing, release notes…; no query strings)

curl -s -X POST "https://api.closefinch.com/v1/competitors/$ID/pages" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/competitors/${id}/pages`, {
  method: "POST",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}`, "content-type": "application/json" },
  body: JSON.stringify({}), // fields: see the OpenAPI schema
});
const data = await res.json();

DELETE /v1/competitors/$ID/pages/$PAGE

Stop monitoring a page (its change log stays until the competitor is removed)

curl -s -X DELETE "https://api.closefinch.com/v1/competitors/$ID/pages/$PAGE" \
  -H "Authorization: Bearer $RA_API_KEY"
const res = await fetch(`https://api.closefinch.com/v1/competitors/${id}/pages/${page}`, {
  method: "DELETE",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}` },
});
const data = await res.json();

POST /v1/competitors/refresh

The monthly pass in the background now: pages, mentions and battlecard proposals for every competitor (at most every 10 minutes; poll the list)

curl -s -X POST "https://api.closefinch.com/v1/competitors/refresh" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/competitors/refresh`, {
  method: "POST",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}`, "content-type": "application/json" },
  body: JSON.stringify({}), // fields: see the OpenAPI schema
});
const data = await res.json();

POST /v1/competitors/scan-mentions

Look for competitor mentions in the last N days of conversations, notes and emails (open deals' owners are told about new ones)

curl -s -X POST "https://api.closefinch.com/v1/competitors/scan-mentions" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/competitors/scan-mentions`, {
  method: "POST",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}`, "content-type": "application/json" },
  body: JSON.stringify({}), // fields: see the OpenAPI schema
});
const data = await res.json();

Request and response schemas: https://www.closefinch.com/openapi.json. All resources: API reference.

Send feedback

Tell us what's broken, confusing or missing on this page, or an idea. It goes to the team that builds the product.

Please don't include passwords or card numbers.
Only to reply about this. Never added to any mailing list.