Skip to content

API reference

API: Meetings

Markdown version

MethodPathWhat it doesScope
POST/v1/activities/:id/collateralDraft collateral from this meeting into a document canvas for you to review: a recap, proposal outline, mutual action plan or competitor comparisontranscripts:write
GET/v1/activities/:id/outcomeA conversation's outcome: summary, action items (with their tasks), follow-up draft, sentiment, disposition, tags, analyzer results — each item citing the transcripttranscripts:read
POST/v1/activities/:id/outcome/rerunMake the conversation's outcome again (e.g. after changing analyzers or tags)transcripts:write
PUT/v1/activities/:id/outcome/tagsSet a conversation's tags by hand (kept when the outcome is made again)transcripts:write
POST/v1/activities/:id/outcome/tasksTurn a conversation's action items (all, or the ones named by key) into taskstranscripts:write
GET/v1/conversation-analyzersPost-call analyzers: structured values pulled from every conversation (or those with a tag)transcripts:read
POST/v1/conversation-analyzersAdd an analyzer (owner)settings:write
DELETE/v1/conversation-analyzers/:idDelete an analyzer (owner); past results stay on their outcomessettings:write
PATCH/v1/conversation-analyzers/:idChange or turn off an analyzer (owner)settings:write
GET/v1/conversation-tagsConversation tags (the description guides auto-tagging)transcripts:read
POST/v1/conversation-tagsAdd a tag (owner)settings:write
DELETE/v1/conversation-tags/:idDelete a tag (owner)settings:write
POST/v1/conversations/reanalyzeMake outcomes for conversations in a date range (optionally on a record) (owner): an estimate first (count, tokens, cost), then confirm to queue themsettings:write
DELETE/v1/conversations/reanalyze/:idCancel a re-analysis batch (what hasn't started yet) (owner)settings:write
GET/v1/conversations/reanalyze/:idA re-analysis batch's progress (jobs by status)transcripts:read
GET/v1/deals/:id/contact-rolesEach contact's role on a deal (champion, economic buyer…): set by a person or proposed from a conversationdeals:read
PUT/v1/deals/:id/contact-rolesSet (or clear, role null) a contact's role on a deal; a person's call isn't replaced by conversationsdeals:write
GET/v1/insight-themesThe insight taxonomy (themes per kind; grows as conversations name new ones, editable)transcripts:read
PATCH/v1/insight-themes/:idRename a theme or merge it into another (its insights move) (owner)settings:write
GET/v1/insightsInsights from conversations (feedback, feature requests, objections, competitors, product gaps, lost/churn reasons), each with its quotetranscripts:read
GET/v1/insights/summaryInsight counts by kind and theme (and competitor), over a period, with deals won/lost/open alongsidetranscripts:read
GET/v1/meetingsList meetings (filters: q, owner_id, list_id, linked_to, dismissed, filter[field]=value, filter[field][gte|lte|gt|lt|in|exists]=value)activities:read
POST/v1/meetingsCreate a meetingactivities:write
DELETE/v1/meetings/:idArchive a record (restore with POST …/restore)activities:write
GET/v1/meetings/:idGet a record (as_of=ISO time for its values at that moment). A merged record answers 301 with the survivor's id.activities:read
PATCH/v1/meetings/:idUpdate values or owner. A merged record answers 410. Pass version for optimistic concurrency.activities:write
POST/v1/meetings/:id/dismissDismiss a noise record so it stops resurfacing (undo with dismissed: false)activities:write
GET/v1/meetings/:id/historyEvery change to this record, newest first, with field-level before and after. Values that came from an item now private (or metadata-only) to someone else show as null with redacted: true.activities:read
POST/v1/meetings/:id/mergeMerge other records into this one. They redirect here afterwards.activities:write
GET/v1/meetings/:id/provenanceWhere each current value came from (user, API, import, activity, agent or sync). link points at the activity, import row or record behind it.activities:read
POST/v1/meetings/:id/restoreRestore an archived recordactivities:write
GET/v1/meetings/:id/timelineActivity about this record, newest first (deleted-at-source items hidden)activities:read
POST/v1/meetings/analyze-writeBefore creating or updating: does this record already exist? Returns create, update (with the record to update) or review, with every match (same email, domain, phone, LinkedIn, same or similar name), rows of a batch that repeat each other, and for updates the values that would be overwritten. Agents' creates run this check and are refused when the record exists.activities:read
POST/v1/meetings/bulkCreate up to 25 records. Each row_key (yours alone) is idempotent: the same key and data replays the record it created; the same key with different data is a conflict.activities:write
POST/v1/meetings/dismissDismiss (or undo with dismissed: false) many noise records at onceactivities:write
POST/v1/meetings/duplicatesCheck for existing records before creating or updating (same email, domain, phone, LinkedIn or name)activities:read
GET/v1/meetings/possible-duplicatesGroups of records that look like the same thing (shared email, domain, phone, LinkedIn or exact name), to review and mergeactivities:read
GET/v1/meetings/schemaJSON Schemas for create and update bodies, including this organization's custom fieldsactivities:read
GET/v1/settings/collateral-templatesThe template each kind of collateral follows (the org's, or the built-in default)transcripts:read
PUT/v1/settings/collateral-templates/:kindSet the org's template for a kind of collateral (owner; body null = back to the default)settings:write

Examples

POST /v1/activities/$ID/collateral

Draft collateral from this meeting into a document canvas for you to review: a recap, proposal outline, mutual action plan or competitor comparison

curl -s -X POST "https://api.closefinch.com/v1/activities/$ID/collateral" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/activities/${id}/collateral`, {
  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/activities/$ID/outcome

A conversation's outcome: summary, action items (with their tasks), follow-up draft, sentiment, disposition, tags, analyzer results — each item citing the transcript

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

POST /v1/activities/$ID/outcome/rerun

Make the conversation's outcome again (e.g. after changing analyzers or tags)

curl -s -X POST "https://api.closefinch.com/v1/activities/$ID/outcome/rerun" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/activities/${id}/outcome/rerun`, {
  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();

PUT /v1/activities/$ID/outcome/tags

Set a conversation's tags by hand (kept when the outcome is made again)

curl -s -X PUT "https://api.closefinch.com/v1/activities/$ID/outcome/tags" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/activities/${id}/outcome/tags`, {
  method: "PUT",
  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/activities/$ID/outcome/tasks

Turn a conversation's action items (all, or the ones named by key) into tasks

curl -s -X POST "https://api.closefinch.com/v1/activities/$ID/outcome/tasks" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/activities/${id}/outcome/tasks`, {
  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/conversation-analyzers

Post-call analyzers: structured values pulled from every conversation (or those with a tag)

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

POST /v1/conversation-analyzers

Add an analyzer (owner)

curl -s -X POST "https://api.closefinch.com/v1/conversation-analyzers" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/conversation-analyzers`, {
  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/conversation-analyzers/$ID

Delete an analyzer (owner); past results stay on their outcomes

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

PATCH /v1/conversation-analyzers/$ID

Change or turn off an analyzer (owner)

curl -s -X PATCH "https://api.closefinch.com/v1/conversation-analyzers/$ID" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/conversation-analyzers/${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();

GET /v1/conversation-tags

Conversation tags (the description guides auto-tagging)

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

POST /v1/conversation-tags

Add a tag (owner)

curl -s -X POST "https://api.closefinch.com/v1/conversation-tags" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/conversation-tags`, {
  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/conversation-tags/$ID

Delete a tag (owner)

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

POST /v1/conversations/reanalyze

Make outcomes for conversations in a date range (optionally on a record) (owner): an estimate first (count, tokens, cost), then confirm to queue them

curl -s -X POST "https://api.closefinch.com/v1/conversations/reanalyze" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/conversations/reanalyze`, {
  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/conversations/reanalyze/$ID

Cancel a re-analysis batch (what hasn't started yet) (owner)

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

GET /v1/conversations/reanalyze/$ID

A re-analysis batch's progress (jobs by status)

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

GET /v1/deals/$ID/contact-roles

Each contact's role on a deal (champion, economic buyer…): set by a person or proposed from a conversation

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

PUT /v1/deals/$ID/contact-roles

Set (or clear, role null) a contact's role on a deal; a person's call isn't replaced by conversations

curl -s -X PUT "https://api.closefinch.com/v1/deals/$ID/contact-roles" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/deals/${id}/contact-roles`, {
  method: "PUT",
  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/insight-themes

The insight taxonomy (themes per kind; grows as conversations name new ones, editable)

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

PATCH /v1/insight-themes/$ID

Rename a theme or merge it into another (its insights move) (owner)

curl -s -X PATCH "https://api.closefinch.com/v1/insight-themes/$ID" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/insight-themes/${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();

GET /v1/insights

Insights from conversations (feedback, feature requests, objections, competitors, product gaps, lost/churn reasons), each with its quote

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

GET /v1/insights/summary

Insight counts by kind and theme (and competitor), over a period, with deals won/lost/open alongside

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

GET /v1/meetings

List meetings (filters: q, owner_id, list_id, linked_to, dismissed, filter[field]=value, filter[field][gte|lte|gt|lt|in|exists]=value)

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

POST /v1/meetings

Create a meeting

curl -s -X POST "https://api.closefinch.com/v1/meetings" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/meetings`, {
  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/meetings/$ID

Archive a record (restore with POST …/restore)

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

GET /v1/meetings/$ID

Get a record (as_of=ISO time for its values at that moment). A merged record answers 301 with the survivor's id.

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

PATCH /v1/meetings/$ID

Update values or owner. A merged record answers 410. Pass version for optimistic concurrency.

curl -s -X PATCH "https://api.closefinch.com/v1/meetings/$ID" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/meetings/${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/meetings/$ID/dismiss

Dismiss a noise record so it stops resurfacing (undo with dismissed: false)

curl -s -X POST "https://api.closefinch.com/v1/meetings/$ID/dismiss" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/meetings/${id}/dismiss`, {
  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/meetings/$ID/history

Every change to this record, newest first, with field-level before and after. Values that came from an item now private (or metadata-only) to someone else show as null with redacted: true.

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

POST /v1/meetings/$ID/merge

Merge other records into this one. They redirect here afterwards.

curl -s -X POST "https://api.closefinch.com/v1/meetings/$ID/merge" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/meetings/${id}/merge`, {
  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/meetings/$ID/provenance

Where each current value came from (user, API, import, activity, agent or sync). link points at the activity, import row or record behind it.

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

POST /v1/meetings/$ID/restore

Restore an archived record

curl -s -X POST "https://api.closefinch.com/v1/meetings/$ID/restore" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/meetings/${id}/restore`, {
  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/meetings/$ID/timeline

Activity about this record, newest first (deleted-at-source items hidden)

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

POST /v1/meetings/analyze-write

Before creating or updating: does this record already exist? Returns create, update (with the record to update) or review, with every match (same email, domain, phone, LinkedIn, same or similar name), rows of a batch that repeat each other, and for updates the values that would be overwritten. Agents' creates run this check and are refused when the record exists.

curl -s -X POST "https://api.closefinch.com/v1/meetings/analyze-write" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/meetings/analyze-write`, {
  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/meetings/bulk

Create up to 25 records. Each row_key (yours alone) is idempotent: the same key and data replays the record it created; the same key with different data is a conflict.

curl -s -X POST "https://api.closefinch.com/v1/meetings/bulk" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/meetings/bulk`, {
  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/meetings/dismiss

Dismiss (or undo with dismissed: false) many noise records at once

curl -s -X POST "https://api.closefinch.com/v1/meetings/dismiss" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/meetings/dismiss`, {
  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/meetings/duplicates

Check for existing records before creating or updating (same email, domain, phone, LinkedIn or name)

curl -s -X POST "https://api.closefinch.com/v1/meetings/duplicates" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/meetings/duplicates`, {
  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/meetings/possible-duplicates

Groups of records that look like the same thing (shared email, domain, phone, LinkedIn or exact name), to review and merge

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

GET /v1/meetings/schema

JSON Schemas for create and update bodies, including this organization's custom fields

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

GET /v1/settings/collateral-templates

The template each kind of collateral follows (the org's, or the built-in default)

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

PUT /v1/settings/collateral-templates/$KIND

Set the org's template for a kind of collateral (owner; body null = back to the default)

curl -s -X PUT "https://api.closefinch.com/v1/settings/collateral-templates/$KIND" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
const res = await fetch(`https://api.closefinch.com/v1/settings/collateral-templates/${kind}`, {
  method: "PUT",
  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.