Search guides, the API reference, Help Center and FAQ.
API Reference
Integrate your CRM or agent with CloseMagnet using the customer HTTP API. These examples describe the reviewed source contract. Reading this reference does not grant access or verify your account configuration.
Authentication
Create a credential in Sign in as the account owner at Settings > API. Prefer one scoped credential per integration where supported; the documented legacy buyer and coaching intakes require the account API token instead.. Keep it secret and send it only to the CloseMagnet application API.
Authentication Header
Authorization: Bearer $CLOSEMAGNET_API_TOKEN- Never put a real credential in a URL, documentation sample, shared source file or support message. Store it in your secret manager or local environment.
- Credentials select one account. Supplying another account ID cannot widen access. Scopes and product access are checked again by the operation.
- Account API tokens and scoped credentials differ. New property-management writes require a scoped credential; do not assume an account token unlocks every operation.
- Buyer intake, the GHL buyer adapter and external coaching-call intake require the account API token in the reviewed source. An empty scope list on these operations does not mean anonymous access or support for arbitrary scoped credentials.
- MCP additionally accepts a bare X-API-Key header. This is not a general alternative header for every REST operation.
Rate Limits
Up to 120 requests per credential and 240 requests per IP address in a 60-second window, subject to the notes below.
- Additional per-credential or operation-specific limits may apply. Slow down on 429; do not turn a transport timeout into a blind write retry.
- MCP has its own caller-IP budget: 240/minute with a credential, 60/minute without one, and Retry-After: 60. Tool calls also use the underlying API budgets.
Availability and Examples
Source-reviewed contracts and explicitly synthetic examples; not a live API or provider qualification.
- Reading these pages needs no login. API calls still require your own authorized account credential and the relevant product access.
- Response excerpts show real source-established field names, not exhaustive JSON Schema or observed account data. Optional/nested records vary by operation.
- A source contract does not certify current production deployment, your provider's settings, inbox placement or delivery. Confirm actual outcomes in your account.
- The reference includes customer integration routes and compatibility aliases as well as MCP tools. Aliases are not extra agent tools.
Examples use synthetic identifiers. Replace them with your own reviewed account values. No request is executed from this page.
Leads
GET/api/v2/leadsList leads
List leads
List or search leads for the authenticated CloseMagnet client.
- Required Scope
- leads:read_all
- Operation Type
- read
- MCP Tool
- list_leads
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
campaign_idquery / Optional | uuid | Filter by voice campaign UUID. |
tabquery / Optional | string | Dashboard lead tab filter.Maximum length: 32 |
statequery / Optional | string | Lead state filter.Maximum length: 64 |
qquery / Optional | string | Free-text search.Maximum length: 200 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/leads?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/leads/{lead_id}Get lead
Get lead
Get one enriched lead by UUID.
- Required Scope
- leads:read_all
- Operation Type
- read
- MCP Tool
- get_lead
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
lead_idpath / Required | uuid | Lead UUID. |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/leads/00000000-0000-4000-8000-000000000001' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: id, campaign_id, campaign_name, campaign_timezone, first_name, last_name, phone, email, custom, call_status, attempts_made, total_attempts, next_call_at, last_call_at, created_at, lead_ref, location_id, address. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"id": "00000000-0000-4000-8000-000000000001"
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}404 - No record visible to this credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "not_found"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/leads/overviewGet leads overview
Get leads overview
Get lead overview metrics and leads-added-per-day data.
- Required Scope
- leads:read_all
- Operation Type
- read
- MCP Tool
- get_leads_overview
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
campaign_idquery / Optional | uuid | Filter by voice campaign UUID. |
startquery / Optional | datetime | Inclusive period start. |
endquery / Optional | datetime | Exclusive period end. |
timezonequery / Optional | string | IANA timezone; defaults to UTC.Maximum length: 80 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/leads/overview' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: overview, per_day. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/leads/draftsList message drafts
List message drafts
List the message drafts this API credential created, newest first, with their approval status.
- Required Scope
- leads:read
- Operation Type
- read
- MCP Tool
- list_message_drafts
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
statusquery / Optional | enum | Filter by approval status.Allowed: draft, approved, rejected, canceled, sent |
lead_idquery / Optional | uuid | Filter by lead UUID. |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/leads/drafts?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}Calls
GET/api/v2/callsList calls
List calls
List the unified AI and human call log with summaries and dispositions.
- Required Scope
- calls:read
- Operation Type
- read
- MCP Tool
- list_calls
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
kindquery / Optional | enum | Restrict the log to AI or human calls.Allowed: ai, human |
campaign_idquery / Optional | uuid | Filter by voice campaign UUID. |
fromquery / Optional | datetime | Inclusive period start. |
toquery / Optional | datetime | Exclusive period end. |
qquery / Optional | string | Free-text search.Maximum length: 200 |
dispositionquery / Optional | string | Disposition filter.Maximum length: 120 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/calls?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/calls/{call_kind}/{call_id}Get call
Get call
Get one AI or human call with its summary and disposition history.
- Required Scope
- calls:read
- Operation Type
- read
- MCP Tool
- get_call
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
call_kindpath / Required | enum | Call source family.Allowed: ai, human |
call_idpath / Required | uuid | Call UUID. |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/calls/ai/00000000-0000-4000-8000-000000000001' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: id, call_kind, campaign_id, lead_id, attempt_number, started_at, ended_at, duration_sec, ended_reason, connected, voicemail, success, outcome, structured_output, structured_data, success_evaluation, transcript, summary, summary_score, deal_score, deal_band, deal_reason, dispositions. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"id": "00000000-0000-4000-8000-000000000001"
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}404 - No record visible to this credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "not_found"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/calls/per-dayGet calls per day
Get calls per day
Get daily call-volume trends.
- Required Scope
- calls:read
- Operation Type
- read
- MCP Tool
- get_calls_per_day
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
campaign_idquery / Optional | uuid | Filter by voice campaign UUID. |
startquery / Optional | datetime | Inclusive period start. |
endquery / Optional | datetime | Exclusive period end. |
timezonequery / Optional | string | IANA timezone; defaults to UTC.Maximum length: 80 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/calls/per-day' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: items. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"items": []
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/calls/dispositionsGet call dispositions
Get call dispositions
Get call disposition counts for a period.
- Required Scope
- calls:read
- Operation Type
- read
- MCP Tool
- get_call_dispositions
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
startquery / Optional | datetime | Inclusive period start. |
endquery / Optional | datetime | Exclusive period end. |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/calls/dispositions' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: items. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"items": []
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}KPIs
GET/api/v2/kpisGet kpis
Get kpis
Get KPI counters, comparisons, timeseries, recap, and account statistics.
- Required Scope
- kpi:read
- Operation Type
- read
- MCP Tool
- get_kpis
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
fromquery / Optional | day | Start day in YYYY-MM-DD format. |
toquery / Optional | day | End day in YYYY-MM-DD format. |
marketquery / Optional | string | Market filter.Maximum length: 120 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/kpis' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: window, counters, deal_counters, leads_by_source, leads_by_assigned, dashboard, timeseries, weekly_recap, account_stats. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}Buyers and buyer directory
GET/api/v2/buyersList buyers
List buyers
List or search the authenticated client's buyers.
- Required Scope
- buyers:read
- Operation Type
- read
- MCP Tool
- list_buyers
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
qquery / Optional | string | Free-text search.Maximum length: 200 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/buyers?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/buyers/{buyer_id}Get buyer
Get buyer
Get one buyer with notes by UUID.
- Required Scope
- buyers:read
- Operation Type
- read
- MCP Tool
- get_buyer
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
buyer_idpath / Required | uuid | Buyer UUID. |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/buyers/00000000-0000-4000-8000-000000000001' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: id, name, entity_name, llc_name, phones, emails, do_not_contact, target_states, target_cities, target_zips, strategy, buyer_types, close_by, is_active, not_active_reason, pipeline_stage, tier, source, investor_notes, properties_per_month, deal_breakers, perfect_deal, asset_class, purchase_method, property_types, price_range, closing_timeline, address1, city, state, postal_code, custom, created_at, updated_at, notes. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"id": "00000000-0000-4000-8000-000000000001"
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}404 - No record visible to this credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "not_found"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/buyers/analyticsGet buyer analytics
Get buyer analytics
Get buyer analytics and track-record metrics.
- Required Scope
- buyers:read
- Operation Type
- read
- MCP Tool
- get_buyer_analytics
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
fromquery / Optional | datetime | Inclusive period start. |
toquery / Optional | datetime | Exclusive period end. |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/buyers/analytics' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: items. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"items": []
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/buyer-directorySearch buyer directory
Search buyer directory
Search the buyer directory without performing a billable reveal.
- Required Scope
- buyers:read
- Operation Type
- read
- MCP Tool
- search_buyer_directory
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
filterquery / Optional | object | Directory filter object. |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/buyer-directory?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/buyer-directory/mapSearch buyer directory map
Search buyer directory map
Search buyer-directory map results within optional bounds and filters.
- Required Scope
- buyers:read
- Operation Type
- read
- MCP Tool
- search_buyer_directory_map
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
boundsquery / Optional | object | Map bounds object. |
filterquery / Optional | object | Directory filter object. |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/buyer-directory/map' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: items. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"items": []
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/buyers/matchMatch buyers
Match buyers
Rank this client's cash buyers against one of its properties, returning the buy-box fit, engagement intent, closing reliability and the weighted likelihood behind each position.
- Required Scope
- buyers:read
- Operation Type
- read
- MCP Tool
- match_buyers
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
property_idquery / Required | uuid | Property UUID to rank buyers against; must belong to the authenticated client. |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/buyers/match?property_id=00000000-0000-4000-8000-000000000001&limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: property_id, items, total, limit, offset, excluded_do_not_contact, scan_cap, truncated, weights. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"items": []
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}Properties
GET/api/v2/propertiesList properties
List properties
List or search properties for the authenticated client.
- Required Scope
- properties:read
- Operation Type
- read
- MCP Tool
- list_properties
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
qquery / Optional | string | Free-text search.Maximum length: 200 |
statusquery / Optional | string | Property status filter.Maximum length: 64 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/properties?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/properties/{property_id}Get property
Get property
Get one property by UUID.
- Required Scope
- properties:read
- Operation Type
- read
- MCP Tool
- get_property
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
property_idpath / Required | uuid | Property UUID. |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/properties/00000000-0000-4000-8000-000000000001' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: id, address, street, city, state, zip, status, fell_through_reason, exit_type, contract_price, asking_price, arv, repair_estimate, assignment_fee_target, comp_id, beds, baths, sqft, year_built, listed_on_mls, mls_list_date, mls_list_price, mls_number, offer_deadline, description, access_notes, title_company, emd_terms, contract_date, close_date, notes, apn, purchase_emd_amount, purchase_closing_date, contract_inspection_end_date, created_at, updated_at, external_ref, source_type, intake_source, jv_contact_id, jv_split_pct, seller_crm_contact_id, active_transaction_id, deal_page_published, owners. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"id": "00000000-0000-4000-8000-000000000001"
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}404 - No record visible to this credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "not_found"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/properties/stagesList property stages
List property stages
List the 17 property stages in order with labels and terminal flags, the fall-through categories and attributions, and the stages that may carry a buyer and a fee. Pass property_id to see which stages that property can move to now and why one is blocked. Read this before set_property_stage.
- Required Scope
- properties:read
- Operation Type
- read
- MCP Tool
- list_property_stages
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
property_idquery / Optional | uuid | Optional property UUID; adds allowed and blocked_reason for that property. |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/properties/stages' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: property_id, current_stage, stages, fall_through_categories, fall_through_attributions, buyer_and_fee_stages. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}Comps
GET/api/v2/compsList comps
List comps
List or search comps and their underwriting summaries.
- Required Scope
- comps:read
- Operation Type
- read
- MCP Tool
- list_comps
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
qquery / Optional | string | Free-text search.Maximum length: 200 |
statusquery / Optional | string | Comp status filter.Maximum length: 64 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/comps?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/comps/{comp_id}Get comp
Get comp
Get one comp and its underwriting detail by UUID.
- Required Scope
- comps:read
- Operation Type
- read
- MCP Tool
- get_comp
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
comp_idpath / Required | uuid | Comp UUID. |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/comps/00000000-0000-4000-8000-000000000001' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: id, status, address, street, city, state, postal_code, arv_multiplier, wholesale_fee, holding_cost, rehab_override, arv, arv_low, arv_high, as_is, mao, cash_offer, open_offer, open_gross, cash_gross, mao_gross, ai_rehab, rent, beds, baths, sqft, year_built, lot_sqft, confidence, manual_review, review_reason, note_text, report_markdown, selected_strategy, revision_number, ran_at, received_at, updated_at, candidates, underwriting. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"id": "00000000-0000-4000-8000-000000000001"
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}404 - No record visible to this credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "not_found"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}Campaigns
GET/api/v2/campaignsList campaigns
List campaigns
List voice campaigns with summary statistics and dial status.
- Required Scope
- campaigns:read
- Operation Type
- read
- MCP Tool
- list_campaigns
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
statusquery / Optional | string | Campaign status filter.Maximum length: 64 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/campaigns?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/campaigns/{campaign_id}Get campaign
Get campaign
Get one voice campaign with summary statistics and schedule state.
- Required Scope
- campaigns:read
- Operation Type
- read
- MCP Tool
- get_campaign
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
campaign_idpath / Required | uuid | Campaign UUID. |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/campaigns/00000000-0000-4000-8000-000000000001' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: id, name, status, campaign_type, dialer_mode, timezone, start_date, end_date, days_of_week, call_window_start, call_window_end, total_attempts, max_daily_attempts, min_redial_wait_min, voicemail_is_answered, outbound_cold_calling, dial_state, lead_stats, summary, created_at. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"id": "00000000-0000-4000-8000-000000000001"
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}404 - No record visible to this credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "not_found"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}Blasts
GET/api/v2/blastsList blasts
List blasts
List blasts with funnel counts.
- Required Scope
- blasts:read
- Operation Type
- read
- MCP Tool
- list_blasts
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
statusquery / Optional | string | Blast status filter.Maximum length: 64 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/blasts?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/blasts/{blast_id}Get blast
Get blast
Get one blast with funnel counts by UUID.
- Required Scope
- blasts:read
- Operation Type
- read
- MCP Tool
- get_blast
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
blast_idpath / Required | uuid | Blast UUID. |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/blasts/00000000-0000-4000-8000-000000000001' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: id, property_id, name, status, channels, audience_kind, segment_id, subject, body_email, body_sms, scheduled_at, created_at, updated_at, funnel. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"id": "00000000-0000-4000-8000-000000000001"
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}404 - No record visible to this credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "not_found"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}Segments
GET/api/v2/segmentsList segments
List segments
List saved segments with normalized filters and counts.
- Required Scope
- segments:read
- Operation Type
- read
- MCP Tool
- list_segments
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/segments?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}Credits and billing
GET/api/v2/creditsGet credits
Get credits
Get the authenticated client's wallet balance.
- Required Scope
- credits:read
- Operation Type
- read
- MCP Tool
- get_credits
- Read-only; no record is changed.
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/credits' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: balance_credits, paused_nonpayment, auto_refill_enabled, auto_refill_threshold_credits, auto_refill_amount_cents, has_auto_refill_payment_method, lifetime_purchased_cents, lifetime_credits_added, lifetime_credits_used. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/credits/usageList credit usage
List credit usage
List customer-safe wallet usage history.
- Required Scope
- credits:read
- Operation Type
- read
- MCP Tool
- list_credit_usage
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/credits/usage?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/credits/paymentsList credit payments
List credit payments
List payment and purchase history.
- Required Scope
- credits:read
- Operation Type
- read
- MCP Tool
- list_credit_payments
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/credits/payments?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/credits/adjustmentsList credit adjustments
List credit adjustments
List wallet credit grants and refunds.
- Required Scope
- credits:read
- Operation Type
- read
- MCP Tool
- list_credit_adjustments
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/credits/adjustments?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}Transactions
GET/api/v2/transactionsList transactions
List transactions
List transaction workfiles with property, stage, and deadline data.
- Required Scope
- transactions:read
- Operation Type
- read
- MCP Tool
- list_transactions
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
statusquery / Optional | string | Transaction status filter.Maximum length: 64 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/transactions?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/transactions/{transaction_id}Get transaction
Get transaction
Get one transaction workfile by UUID.
- Required Scope
- transactions:read
- Operation Type
- read
- MCP Tool
- get_transaction
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
transaction_idpath / Required | uuid | Transaction UUID. |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/transactions/00000000-0000-4000-8000-000000000001' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: id, property_id, address, city, state, zip, property_status, exit_strategy, ratification_date, seller_emd_amount, seller_emd_holder, seller_emd_deadline, seller_emd_received_at, buyer_emd_amount, buyer_emd_holder, buyer_emd_deadline, buyer_emd_received_at, title_company, title_officer, title_phone, title_email, title_file_number, title_order_date, title_commitment_date, clear_to_close_at, audit_flags, cycle_number, cycle_status, cycle_started_at, cycle_ended_at, cycle_reason, gross_assignment_fee, actual_deal_profit, gross_listing_commission, deal_expenses, first_scheduled_closing_date, second_scheduled_closing_date, created_at, updated_at, section19_notes, owners. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"id": "00000000-0000-4000-8000-000000000001"
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}404 - No record visible to this credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "not_found"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/transactions/{transaction_id}/tasksList transaction tasks
List transaction tasks
List open or completed tasks for one transaction workfile.
- Required Scope
- transactions:read
- Operation Type
- read
- MCP Tool
- list_transaction_tasks
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
transaction_idpath / Required | uuid | Transaction UUID. |
statusquery / Optional | string | Task status filter.Maximum length: 64 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/transactions/00000000-0000-4000-8000-000000000001/tasks?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}404 - No record visible to this credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "not_found"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/transactions/badgesGet transaction badges
Get transaction badges
Get transaction property badges and deadline state.
- Required Scope
- transactions:read
- Operation Type
- read
- MCP Tool
- get_transaction_badges
- Read-only; no record is changed.
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/transactions/badges' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: items. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"items": []
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/transactions/{transaction_id}/partiesList transaction parties
List transaction parties
List the parties on one transaction workfile (seller, buyer, title, escrow, lender, jv_partner, agent, other), optionally for one role.
- Required Scope
- transactions:read
- Operation Type
- read
- MCP Tool
- list_transaction_parties
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
transaction_idpath / Required | uuid | Transaction UUID. |
rolequery / Optional | enum | Only parties with this role.Allowed: seller, buyer, title, escrow, lender, jv_partner, agent, other |
limitquery / Optional | integer | Page size; defaults to 100.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/transactions/00000000-0000-4000-8000-000000000001/parties?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 100,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/transactions/{transaction_id}/tasks/assigneesList transaction task assignees
List transaction task assignees
List who can be put on a task of one transaction workfile: the app's own assignee roster for the account, including users of each connected CRM location. Each item has an option value to pass to assign_transaction_task, whether the person is task_assignable and owner_assignable, and complete says whether the whole list loaded. Items carry a label (the person's name, or null when they have none; never an email address) and a profile_id; assign by option, profile_id, or an email you already know (assignee_email).
- Required Scope
- transactions:read
- Operation Type
- read
- MCP Tool
- list_transaction_task_assignees
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
transaction_idpath / Required | uuid | Transaction UUID. |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/transactions/00000000-0000-4000-8000-000000000001/tasks/assignees' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: items. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"items": []
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}Deals
GET/api/v2/deals/offersList offers
List offers
List offers received on the client's properties.
- Required Scope
- deals:read
- Operation Type
- read
- MCP Tool
- list_offers
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
property_idquery / Optional | uuid | Filter by property UUID. |
statusquery / Optional | string | Offer status filter.Maximum length: 64 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/deals/offers?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/deals/offers/{offer_id}Get offer
Get offer
Get one offer on a client property by UUID.
- Required Scope
- deals:read
- Operation Type
- read
- MCP Tool
- get_offer
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
offer_idpath / Required | uuid | Offer UUID. |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/deals/offers/00000000-0000-4000-8000-000000000001' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: id, property_id, buyer_id, buyer_name, buyer_entity_name, address, city, state, zip, property_status, asking_price, contract_price, assignment_fee_target, amount, status, source, close_by, inspection_end_date, emd_amount, emd_due_at, emd_received, emd_received_at, contract_sent, contract_sent_at, contract_signed, contract_signed_at, has_proof_of_funds, funding_type, funding_other, fell_through_reason, public_submission_id, notes, created_at, updated_at. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"id": "00000000-0000-4000-8000-000000000001"
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}404 - No record visible to this credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "not_found"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/deals/analyticsGet deal analytics
Get deal analytics
Get deal page performance totals for a period.
- Required Scope
- deals:read
- Operation Type
- read
- MCP Tool
- get_deal_analytics
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
fromquery / Optional | datetime | Inclusive period start. |
toquery / Optional | datetime | Exclusive period end. |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/deals/analytics?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: items, total, limit, offset, window_start, window_end. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"items": []
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/deals/page-eventsGet deal page events
Get deal page events
List deal page view and interaction events.
- Required Scope
- deals:read
- Operation Type
- read
- MCP Tool
- get_deal_page_events
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
property_idquery / Optional | uuid | Filter by property UUID. |
fromquery / Optional | datetime | Inclusive period start. |
toquery / Optional | datetime | Exclusive period end. |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/deals/page-events?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: items, total, limit, offset, window_start, window_end, totals. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"items": []
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/deals/submissionsList public submissions
List public submissions
List inbound public buyer-interest submissions.
- Required Scope
- deals:read
- Operation Type
- read
- MCP Tool
- list_public_submissions
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
flowquery / Optional | string | Submission flow filter.Maximum length: 32 |
include_pending_reviewquery / Optional | enum | Include rows awaiting identity review; those rows carry no contact channel.Allowed: true, false |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/deals/submissions?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: items, total, limit, offset, includes_pending_review. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"items": []
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/deals/contractsList deal contracts
List deal contracts
List purchase and assignment contracts on the client's deals.
- Required Scope
- deals:read
- Operation Type
- read
- MCP Tool
- list_deal_contracts
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
property_idquery / Optional | uuid | Filter by property UUID. |
kindquery / Optional | string | Contract kind filter.Maximum length: 64 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/deals/contracts?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/deals/jvList jv deals
List jv deals
List joint-venture deal detail records.
- Required Scope
- deals:read
- Operation Type
- read
- MCP Tool
- list_jv_deals
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
property_idquery / Optional | uuid | Filter by property UUID. |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/deals/jv?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}Flips
GET/api/v2/flips/projectsList flip projects
List flip projects
List flip projects with their budget state.
- Required Scope
- flips:read
- Operation Type
- read
- MCP Tool
- list_flip_projects
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
statusquery / Optional | string | Project status filter.Maximum length: 64 |
property_idquery / Optional | uuid | Filter by property UUID. |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/flips/projects?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/flips/projects/{project_id}Get flip project
Get flip project
Get one flip project with its budget state by UUID.
- Required Scope
- flips:read
- Operation Type
- read
- MCP Tool
- get_flip_project
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
project_idpath / Required | uuid | Flip project UUID. |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/flips/projects/00000000-0000-4000-8000-000000000001' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: id, property_id, transaction_id, address, city, state, zip, property_status, contract_price, asking_price, assignment_fee_target, status, first_close_at, activated_at, target_completion_date, actual_completion_date, planned_listing_date, listing_ready_at, listed_at, second_close_at, occupancy_status, possession_date, tenant_move_out_date, occupancy_notes, utilities_status, utilities_notes, alarm_configured, lockbox_installed, holdback_amount, holdback_release_date, final_profit, non_rehab_deal_expenses, project_notes, scope_item_count, scope_open_count, scope_estimate_total, scope_committed_total, scope_invoiced_total, scope_paid_total, task_count, task_done_count, task_blocked_count, task_overdue_count, created_at, updated_at. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"id": "00000000-0000-4000-8000-000000000001"
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}404 - No record visible to this credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "not_found"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/flips/tasksList flip tasks
List flip tasks
List tasks on the client's flip projects.
- Required Scope
- flips:read
- Operation Type
- read
- MCP Tool
- list_flip_tasks
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
project_idquery / Optional | uuid | Filter by flip project UUID. |
statusquery / Optional | string | Task status filter.Maximum length: 32 |
phasequery / Optional | string | Project phase filter.Maximum length: 32 |
include_archivedquery / Optional | enum | Include archived tasks; defaults to false.Allowed: true, false |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/flips/tasks?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: items, total, limit, offset, includes_archived. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"items": []
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/flips/scope-itemsList flip scope items
List flip scope items
List scope-of-work line items on the client's flip projects.
- Required Scope
- flips:read
- Operation Type
- read
- MCP Tool
- list_flip_scope_items
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
project_idquery / Optional | uuid | Filter by flip project UUID. |
statusquery / Optional | string | Scope item status filter.Maximum length: 32 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/flips/scope-items?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: items, total, limit, offset, totals. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"items": []
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/flips/updatesList flip project updates
List flip project updates
List progress updates posted on the client's flip projects.
- Required Scope
- flips:read
- Operation Type
- read
- MCP Tool
- list_flip_project_updates
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
project_idquery / Optional | uuid | Filter by flip project UUID. |
audiencequery / Optional | string | Update audience filter.Maximum length: 32 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/flips/updates?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/flips/notesList flip project notes
List flip project notes
List notes recorded on the client's flip projects.
- Required Scope
- flips:read
- Operation Type
- read
- MCP Tool
- list_flip_project_notes
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
project_idquery / Optional | uuid | Filter by flip project UUID. |
sourcequery / Optional | string | Note source filter.Maximum length: 32 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/flips/notes?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/flips/vendorsList flip vendors
List flip vendors
List the client's flip vendor and trade roster.
- Required Scope
- flips:read
- Operation Type
- read
- MCP Tool
- list_flip_vendors
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
tradequery / Optional | string | Vendor trade filter.Maximum length: 64 |
statusquery / Optional | string | Vendor status filter.Maximum length: 32 |
active_onlyquery / Optional | enum | Restrict to active vendors; defaults to false.Allowed: true, false |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/flips/vendors?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: items, total, limit, offset, active_only. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"items": []
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/flips/inspectionsList flip inspection runs
List flip inspection runs
List inspection runs on the client's flip projects.
- Required Scope
- flips:read
- Operation Type
- read
- MCP Tool
- list_flip_inspection_runs
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
project_idquery / Optional | uuid | Filter by flip project UUID. |
statusquery / Optional | string | Inspection run status filter.Maximum length: 32 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/flips/inspections?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/flips/inspection-itemsList flip inspection items
List flip inspection items
List findings recorded by flip project inspections.
- Required Scope
- flips:read
- Operation Type
- read
- MCP Tool
- list_flip_inspection_items
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
project_idquery / Optional | uuid | Filter by flip project UUID. |
sectionquery / Optional | string | Inspection section filter.Maximum length: 32 |
action_neededquery / Optional | enum | Narrow to findings that do or do not need action; omit for no filter.Allowed: true, false |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/flips/inspection-items?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}Commissions
GET/api/v2/commissions/statementGet commission statement
Get commission statement
Get the commission statement for a member and period.
- Required Scope
- commissions:read
- Operation Type
- read
- MCP Tool
- get_commission_statement
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
profile_idquery / Optional | uuid | Narrow to one team member profile UUID; omit for the whole client. |
monthquery / Optional | day | Any day in the statement month, in YYYY-MM-DD format. |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/commissions/statement?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/commissions/payout-reportGet commission payout report
Get commission payout report
Get the commission payout report for a month.
- Required Scope
- commissions:read
- Operation Type
- read
- MCP Tool
- get_commission_payout_report
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
monthquery / Optional | day | Any day in the payout month, in YYYY-MM-DD format. |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/commissions/payout-report?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/commissions/ledgerList commission ledger entries
List commission ledger entries
List commission ledger entries and their status.
- Required Scope
- commissions:read
- Operation Type
- read
- MCP Tool
- list_commission_ledger_entries
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
profile_idquery / Optional | uuid | Filter by team member profile UUID. |
transaction_idquery / Optional | uuid | Filter by transaction UUID. |
statusquery / Optional | string | Ledger entry status filter.Maximum length: 32 |
entry_kindquery / Optional | string | Ledger entry kind filter.Maximum length: 32 |
monthquery / Optional | day | Any day in the period month, in YYYY-MM-DD format. |
include_supersededquery / Optional | enum | Include superseded entry versions; defaults to false.Allowed: true, false |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/commissions/ledger?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/commissions/ledger/eventsList commission ledger events
List commission ledger events
List the status history of commission ledger entries.
- Required Scope
- commissions:read
- Operation Type
- read
- MCP Tool
- list_commission_ledger_events
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
entry_idquery / Optional | uuid | Filter by ledger entry UUID. |
event_typequery / Optional | string | Ledger event type filter.Maximum length: 32 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/commissions/ledger/events?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/commissions/plansList commission plans
List commission plans
List the client's commission plans.
- Required Scope
- commissions:read
- Operation Type
- read
- MCP Tool
- list_commission_plans
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
applies_toquery / Optional | string | Plan applicability filter.Maximum length: 32 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/commissions/plans?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/commissions/plans/versionsList commission plan versions
List commission plan versions
List versions of the client's commission plans.
- Required Scope
- commissions:read
- Operation Type
- read
- MCP Tool
- list_commission_plan_versions
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
codequery / Optional | string | Commission plan code filter.Maximum length: 64 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/commissions/plans/versions?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/commissions/tiersList commission tiers
List commission tiers
List the tier bands configured on commission plans.
- Required Scope
- commissions:read
- Operation Type
- read
- MCP Tool
- list_commission_tiers
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/commissions/tiers?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/commissions/settingsGet commission settings
Get commission settings
Get the client's commission settings.
- Required Scope
- commissions:read
- Operation Type
- read
- MCP Tool
- get_commission_settings
- Read-only; no record is changed.
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/commissions/settings' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: configured, first_close_basis, tier_period, updated_at, plan_count, tier_count. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/commissions/settlementsList commission quarter settlements
List commission quarter settlements
List quarterly commission settlements per team member.
- Required Scope
- commissions:read
- Operation Type
- read
- MCP Tool
- list_commission_quarter_settlements
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
profile_idquery / Optional | uuid | Filter by team member profile UUID. |
statusquery / Optional | string | Settlement status filter.Maximum length: 32 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/commissions/settlements?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/commissions/employmentList commission member employment
List commission member employment
List commission employment records per team member.
- Required Scope
- commissions:read
- Operation Type
- read
- MCP Tool
- list_commission_member_employment
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
profile_idquery / Optional | uuid | Filter by team member profile UUID. |
statusquery / Optional | string | Employment status filter.Maximum length: 32 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/commissions/employment?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}Coaching
GET/api/v2/coaching/dailyGet coaching daily
Get coaching daily
Get the daily coaching score series for a period.
- Required Scope
- coaching:read
- Operation Type
- read
- MCP Tool
- get_coaching_daily
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
startquery / Required | datetime | Inclusive period start; required because the series is zero-filled. |
endquery / Required | datetime | Exclusive period end; the window may not exceed 366 days. |
tzquery / Optional | string | IANA timezone; defaults to UTC.Maximum length: 64 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/coaching/daily?start=2026-01-01T12%3A00%3A00Z&end=2026-01-01T12%3A00%3A00Z' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: items, total, window_start, window_end, timezone. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"items": []
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/coaching/dealsList coaching deals
List coaching deals
List scored deal opportunities from coaching analysis.
- Required Scope
- coaching:read
- Operation Type
- read
- MCP Tool
- list_coaching_deals
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
startquery / Optional | datetime | Inclusive period start. |
endquery / Optional | datetime | Exclusive period end. |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/coaching/deals?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/coaching/ai-callsList coaching ai calls
List coaching ai calls
List AI calls with their coaching scores.
- Required Scope
- coaching:read
- Operation Type
- read
- MCP Tool
- list_coaching_ai_calls
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
searchquery / Optional | string | Free-text search.Maximum length: 200 |
startquery / Optional | datetime | Inclusive period start. |
endquery / Optional | datetime | Exclusive period end. |
sort_keyquery / Optional | string | Sort column; the wrapper is the enumeration authority.Maximum length: 32 |
sort_directionquery / Optional | string | Sort direction; the wrapper is the enumeration authority.Maximum length: 8 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/coaching/ai-calls?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/coaching/all-callsList coaching all calls
List coaching all calls
List AI and human calls together with their coaching scores.
- Required Scope
- coaching:read
- Operation Type
- read
- MCP Tool
- list_coaching_all_calls
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
searchquery / Optional | string | Free-text search.Maximum length: 200 |
kindquery / Optional | string | Call source family filter; the wrapper is the enumeration authority.Maximum length: 16 |
directionquery / Optional | string | Call direction filter; the wrapper is the enumeration authority.Maximum length: 16 |
dispositionquery / Optional | string | Disposition filter.Maximum length: 120 |
startquery / Optional | datetime | Inclusive period start. |
endquery / Optional | datetime | Exclusive period end. |
sort_keyquery / Optional | string | Sort column; the wrapper is the enumeration authority.Maximum length: 32 |
sort_directionquery / Optional | string | Sort direction; the wrapper is the enumeration authority.Maximum length: 8 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/coaching/all-calls?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/coaching/reportsList coaching saved reports
List coaching saved reports
List saved coaching reports, including team reports.
- Required Scope
- coaching:read
- Operation Type
- read
- MCP Tool
- list_coaching_saved_reports
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
report_typequery / Optional | string | Report type filter.Maximum length: 64 |
subject_keyquery / Optional | string | Report subject key filter.Maximum length: 200 |
generated_at_fromquery / Optional | datetime | Inclusive generated-at lower bound. |
generated_at_beforequery / Optional | datetime | Exclusive generated-at upper bound. |
sort_directionquery / Optional | string | Sort direction; the wrapper is the enumeration authority.Maximum length: 8 |
limitquery / Optional | integer | Keyset page size; defaults to 25.Minimum: 1. Maximum: 100 |
cursor_generated_atquery / Optional | datetime | Keyset cursor timestamp; must be supplied with cursor_report_id. |
cursor_report_idquery / Optional | uuid | Keyset cursor report UUID; must be supplied with cursor_generated_at. |
snapshot_generated_atquery / Optional | datetime | Walk fence timestamp; must be supplied with snapshot_report_id. |
snapshot_report_idquery / Optional | uuid | Walk fence report UUID; must be supplied with snapshot_generated_at. |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/coaching/reports?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: items, total, limit, has_more, sort_direction, snapshot_generated_at, snapshot_report_id. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"items": []
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/coaching/reports/callsList coaching saved report calls
List coaching saved report calls
List the calls captured in one saved coaching report snapshot.
- Required Scope
- coaching:read
- Operation Type
- read
- MCP Tool
- list_coaching_saved_report_calls
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
report_idquery / Required | uuid | Saved coaching report UUID. |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/coaching/reports/calls?report_id=00000000-0000-4000-8000-000000000001&limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}Account
GET/api/v2/account/overviewGet account overview
Get account overview
Get the client's account identity, plan, and size.
- Required Scope
- account:read
- Operation Type
- read
- MCP Tool
- get_account_overview
- Read-only; no record is changed.
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/account/overview' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: client_id, name, slug, status, account_type, timezone, primary_email, primary_phone, created_at, archived_at, access_revoked_at, plan_name, plan_cancel_at_period_end, plan_canceled_at, plan_started_at, resources. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{
"client_id": "00000000-0000-4000-8000-000000000001"
}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/account/surfacesList account surfaces
List account surfaces
List the surfaces enabled for the client's account.
- Required Scope
- account:read
- Operation Type
- read
- MCP Tool
- list_account_surfaces
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
enabledquery / Optional | enum | Narrow to enabled or disabled surfaces; omit for no filter.Allowed: true, false |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/account/surfaces?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/account/packsList account packs
List account packs
List the pack assignments on the client's account.
- Required Scope
- account:read
- Operation Type
- read
- MCP Tool
- list_account_packs
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
enabledquery / Optional | enum | Narrow to enabled or disabled pack assignments; omit for no filter.Allowed: true, false |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/account/packs?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/account/ghl-installGet ghl install status
Get ghl install status
Get whether the client's CRM app is installed.
- Required Scope
- account:read
- Operation Type
- read
- MCP Tool
- get_ghl_install_status
- Read-only; no record is changed.
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/account/ghl-install' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - CRM installation status.
JSON object with fields: installed. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"installed": false
}400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/account/locationsList account locations
List account locations
List the CRM locations the client's account spans.
- Required Scope
- account:read
- Operation Type
- read
- MCP Tool
- list_account_locations
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/account/locations?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/account/checklistGet account checklist
Get account checklist
Get the client's setup checklist state.
- Required Scope
- account:read
- Operation Type
- read
- MCP Tool
- get_account_checklist
- Read-only; no record is changed.
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/account/checklist' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: steps, completed_count, total_count, all_complete, dismissed, celebrated, celebrate, visible. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}Team
GET/api/v2/team/membersList team members
List team members
List the client's team roster and access tiers.
- Required Scope
- team:read
- Operation Type
- read
- MCP Tool
- list_team_members
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
profile_idquery / Optional | uuid | Filter by team member profile UUID. |
workspace_idquery / Optional | uuid | Narrow to one workspace UUID inside the client's own set. |
member_rolequery / Optional | enum | Access tier filter.Allowed: owner, operational |
searchquery / Optional | string | Free-text search.Maximum length: 200 |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/team/members?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/team/members/{profile_id}Get team member
Get team member
Get one team member by profile UUID.
- Required Scope
- team:read
- Operation Type
- read
- MCP Tool
- get_team_member
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
profile_idpath / Required | uuid | Team member profile UUID. |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/team/members/00000000-0000-4000-8000-000000000001' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: profile_id, email, member_role, workspace_role, profile_created_at, joined_at, workspace_count, primary_workspace_id, primary_workspace_name, surface_override_count, surface_disabled_count. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}404 - No record visible to this credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "not_found"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/team/invitesList team invites
List team invites
List pending invites to the client's team.
- Required Scope
- team:read
- Operation Type
- read
- MCP Tool
- list_team_invites
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
member_rolequery / Optional | enum | Invited access tier filter.Allowed: owner, operational |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/team/invites?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/team/member-surfacesList team member surfaces
List team member surfaces
List per-member surface overrides on the client's team.
- Required Scope
- team:read
- Operation Type
- read
- MCP Tool
- list_team_member_surfaces
- Read-only; no record is changed.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
profile_idquery / Optional | uuid | Filter by team member profile UUID. |
surface_keyquery / Optional | string | Surface key filter matched by equality.Maximum length: 64 |
enabledquery / Optional | enum | Narrow to enabled or disabled overrides; omit for no filter.Allowed: true, false |
limitquery / Optional | integer | Page size; defaults to 50.Minimum: 1. Maximum: 200 |
offsetquery / Optional | integer | Zero-based row offset.Minimum: 0. Maximum: 1000000 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/team/member-surfaces?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - A page of matching records.
JSON object with fields: items, total, limit, offset. Nested records keep the operation's own field structure.
Response Example - Synthetic Values
{
"items": [],
"total": 0,
"limit": 50,
"offset": 0
}- Synthetic valid empty page, not an observed account response. Row objects are absent because this example has no matches.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}GET/api/v2/team/overviewGet team overview
Get team overview
Get team, workspace, and invite counts for the client.
- Required Scope
- team:read
- Operation Type
- read
- MCP Tool
- get_team_overview
- Read-only; no record is changed.
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/team/overview' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - The operation's source-defined result.
JSON object with fields: workspaces, members, members_owner, members_operational, memberships, pending_invites, pending_invites_owner, pending_invites_operational, member_surface_overrides, member_surface_disabled. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}Record Writes
POST/api/v2/leads/draftsCreate message draft
Create message draft
Draft a follow-up message to a lead. The draft is inert: it is queued for human approval in the dashboard and nothing is sent until a person approves it.
- Required Scope
- leads:write
- Operation Type
- draft
- MCP Tool
- create_message_draft
- Creates a draft only. A person must release it in CloseMagnet; this operation cannot send, schedule, scrub or spend.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
channelbody / Required | enum | Delivery channel for the drafted message.Allowed: sms, email |
to_refbody / Required | string | Destination the message is drafted for: an email address or an E.164 phone number.Maximum length: 320 |
bodybody / Required | string | Message body, at most 4000 characters.Maximum length: 4000 |
lead_idbody / Optional | uuid | Lead UUID this draft is for; must belong to the authenticated client. |
subjectbody / Optional | string | Subject line, used for the email channel.Maximum length: 200 |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/leads/drafts' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"channel":"email","to_ref":"buyer@example.com","body":"Example draft for human review.","subject":"Example follow-up"}'Request Body
application/json
Request Body - Synthetic Values
{
"channel": "email",
"to_ref": "buyer@example.com",
"body": "Example draft for human review.",
"subject": "Example follow-up"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
Responses
200 - The operation's source-defined result.
JSON object with fields: status, draft_id. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}POST/api/v2/blasts/draftsCreate blast draft
Create blast draft
Assemble a blast as a DRAFT: it creates the campaign and queues its recipients with suppression applied, and it cannot schedule, send, scrub or spend. A person launches it from the dashboard.
- Required Scope
- blasts:write
- Operation Type
- draft
- MCP Tool
- create_blast_draft
- Creates a draft only. A person must release it in CloseMagnet; this operation cannot send, schedule, scrub or spend.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
buyer_idsbody / Required | uuid_array | Audience as platform buyer UUIDs; any id outside the authenticated client is dropped.Minimum items: 1. Maximum items: 5000 |
audience_kindbody / Optional | enum | How the audience was chosen; defaults to match.Allowed: match, manual |
namebody / Optional | string | Label for the drafted blast.Maximum length: 200 |
property_idbody / Optional | uuid | Property UUID this blast is for; must belong to the authenticated client. |
channelsbody / Optional | enum_array | Channels to queue; defaults to both.Allowed: sms, email. Minimum items: 1. Maximum items: 2 |
subjectbody / Optional | string | Email subject snapshot.Maximum length: 200 |
body_emailbody / Optional | string | Email template snapshot.Maximum length: 20000 |
body_smsbody / Optional | string | SMS template snapshot.Maximum length: 1600 |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/blasts/drafts' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"buyer_ids":["00000000-0000-4000-8000-000000000001"]}'Request Body
application/json
Request Body - Synthetic Values
{
"buyer_ids": [
"00000000-0000-4000-8000-000000000001"
]
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
Responses
200 - The operation's source-defined result.
JSON object with fields: status, blast_id, blast_status, audience_count, recipients, suppressed. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}POST/api/v2/deals/offersCreate offer
Create offer
Put an offer on one of your properties, or amend the commercial terms of an existing offer. Omit offer_id to create a new offer; supply it to amend that offer, where an omitted field is left unchanged. An offer a person has already decided is frozen. It cannot accept, decline, back up, mark EMD received, attach a contract or delete: those decisions stay with a person in the dashboard.
- Required Scope
- deals:write
- Operation Type
- write
- MCP Tool
- create_offer
- Changes one live record without a draft approval queue. Grant write access only where intended.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
property_idbody / Required | uuid | Property UUID the offer is on; must belong to the authenticated client. |
buyer_idbody / Optional | uuid | Buyer UUID making the offer; must belong to the authenticated client. Required when creating, ignored when amending. |
offer_idbody / Optional | uuid | Existing offer UUID to amend; it must belong to the authenticated client and to property_id. Omit to create a new offer. |
amountbody / Optional | number | Offer amount in dollars, never negative. The price-relation status is derived from this against the property asking price and is never supplied by the caller.Minimum: 0 |
close_bybody / Optional | day | Requested close date, as YYYY-MM-DD. |
inspection_end_datebody / Optional | day | Inspection period end date, as YYYY-MM-DD. |
emd_amountbody / Optional | number | Earnest money deposit in dollars, never negative. It must meet the property minimum EMD or the request is refused.Minimum: 0 |
emd_due_atbody / Optional | day | Date the earnest money deposit is due, as YYYY-MM-DD. |
funding_typebody / Optional | enum | How the buyer is funding the purchase. Required by the offer terms rules when creating.Allowed: cash, hard_money, private_money, conventional_dscr, seller_finance, other |
funding_otherbody / Optional | string | Description of the funding, required when funding_type is other and rejected otherwise.Maximum length: 200 |
notesbody / Optional | string | Free-text notes stored on the offer.Maximum length: 4000 |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/deals/offers' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"property_id":"00000000-0000-4000-8000-000000000001","buyer_id":"00000000-0000-4000-8000-000000000001","amount":100000,"emd_amount":1000,"funding_type":"cash"}'Request Body
application/json
Request Body - Synthetic Values
{
"property_id": "00000000-0000-4000-8000-000000000001",
"buyer_id": "00000000-0000-4000-8000-000000000001",
"amount": 100000,
"emd_amount": 1000,
"funding_type": "cash"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- Creating an offer requires emd_amount and funding_type. The selected property must have a configured positive minimum EMD, and emd_amount must meet that minimum. The example's 1,000 dollars is illustrative, not the property's minimum; adjust it for your property. Valid funding types are cash, hard_money, private_money, conventional_dscr, seller_finance and other. Choosing other additionally requires funding_other describing it in 200 characters or fewer.
Responses
200 - The operation's source-defined result.
JSON object with fields: status, offer_id. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}POST/api/v2/transactions/{transaction_id}/tasks/{task_id}/completeComplete transaction task
Complete transaction task
Mark one checklist task complete on one active transaction workfile, advancing the deal ladder when that task is a gating one.
- Required Scope
- transactions:write
- Operation Type
- write
- MCP Tool
- complete_transaction_task
- Changes one live record without a draft approval queue. Grant write access only where intended.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
transaction_idpath / Required | uuid | Transaction UUID the task belongs to; must belong to the authenticated client. |
task_idpath / Required | uuid | Checklist task UUID to complete; must belong to the named transaction. |
notesbody / Optional | string | Note to store on the task; omitting it leaves the existing note untouched.Maximum length: 4000 |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/transactions/00000000-0000-4000-8000-000000000001/tasks/00000000-0000-4000-8000-000000000001/complete' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{}'Request Body
application/json
Request Body - Synthetic Values
{}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
Responses
200 - The operation's source-defined result.
JSON object with fields: status, transaction_id, task_id, task_status, property_advanced, new_property_status. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}POST/api/v2/transactions/{transaction_id}/notesAdd transaction note
Add transaction note
Append one manual entry to a transaction workfile's communication log. The entry is an internal record, never an outbound message.
- Required Scope
- transactions:write
- Operation Type
- write
- MCP Tool
- add_transaction_note
- Changes one live record without a draft approval queue. Grant write access only where intended.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
transaction_idpath / Required | uuid | Transaction UUID to append to; must belong to the authenticated client. |
bodybody / Required | string | Note text; markup and control characters are stripped in the database.Maximum length: 100000 |
partybody / Optional | string | Who the entry is with (seller, buyer, title, and so on).Maximum length: 500 |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/transactions/00000000-0000-4000-8000-000000000001/notes' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"body":"Example"}'Request Body
application/json
Request Body - Synthetic Values
{
"body": "Example"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
Responses
200 - The operation's source-defined result.
JSON object with fields: status, transaction_id, note_id. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}POST/api/v2/flips/{flip_id}/tasks/{task_id}/completeComplete flip task
Complete flip task
Mark one live task on a fix-and-flip project done, optionally recording a completion note. It refuses an archived task, a completed or cancelled project, and a task whose predecessors are still open, and it never records a person as the completer.
- Required Scope
- flips:write
- Operation Type
- write
- MCP Tool
- complete_flip_task
- Changes one live record without a draft approval queue. Grant write access only where intended.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
flip_idpath / Required | uuid | Flip project UUID; must belong to the authenticated client. |
task_idpath / Required | uuid | Schedule task UUID belonging to that flip project. |
notesbody / Optional | string | Completion note; access codes and passwords are refused.Maximum length: 2000 |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/flips/00000000-0000-4000-8000-000000000001/tasks/00000000-0000-4000-8000-000000000001/complete' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{}'Request Body
application/json
Request Body - Synthetic Values
{}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
Responses
200 - The operation's source-defined result.
JSON object with fields: status, project_id, task_id, task_status, completed_at. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}POST/api/v2/flips/{flip_id}/notesAdd flip note
Add flip note
Append one note to a fix-and-flip project's append-only note log. The note is stamped as machine-written and can never be edited or removed through this API.
- Required Scope
- flips:write
- Operation Type
- write
- MCP Tool
- add_flip_note
- Changes one live record without a draft approval queue. Grant write access only where intended.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
flip_idpath / Required | uuid | Flip project UUID; must belong to the authenticated client. |
bodybody / Required | string | Note text, 1 to 8000 characters; access codes and passwords are refused.Maximum length: 8000 |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/flips/00000000-0000-4000-8000-000000000001/notes' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"body":"Example"}'Request Body
application/json
Request Body - Synthetic Values
{
"body": "Example"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
Responses
200 - The operation's source-defined result.
JSON object with fields: status, project_id, note_id. Nested records keep the operation's own field structure.
Response Excerpt - Synthetic Values
{}- Synthetic excerpt only, not the complete response or an exhaustive schema. Field values and nested records depend on your account.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}POST/api/v2/compsRequest comp report
Request comp report
Request a comp report on one of this client's properties. THIS CAN COST MONEY: each finished comp uses one of the plan's free comps for the month, then is charged to the CloseMagnet balance at a flat price, so the request is refused unless confirm_spend is exactly true. Retry protection is real but partial, so wait for the report rather than retrying blindly: a retry within about two minutes is refused by the duplicate-address ceiling (429, no charge), and once the engine has recorded the run a retry carrying the same idempotency_key returns that run instead of dispatching again, but a retry that lands between those two windows can dispatch a second run and be charged for it. When the answer is status blocked, the CloseMagnet balance needs funds (or the account cannot run comps right now) and nothing was charged: relay the engine's message, tell the user the CloseMagnet balance needs funds, and do not retry until they say funds were added. There is no purchase link; used and limit are the free comps used and included this month.
- Required Scope
- comps:write
- Operation Type
- write
- MCP Tool
- request_comp_report
- Changes one live record without a draft approval queue. Grant write access only where intended.
- A confirmed comp request can spend credits.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
property_idbody / Required | uuid | Property UUID to run comps on; must belong to the authenticated client. |
confirm_spendbody / Required | boolean | Must be exactly true. A comp run is billed, so an unconfirmed request is refused with confirm_spend_required before anything else happens. |
contact_namebody / Optional | string | Seller contact name to pass to the comp engine.Maximum length: 200 |
contact_phonebody / Optional | string | Seller contact phone to pass to the comp engine.Maximum length: 50 |
repair_estimatebody / Optional | string | Estimated repair cost as a non-negative amount up to 99999999; defaults to the property's own repair estimate.Maximum length: 32 |
ghl_contact_idbody / Optional | string | CRM contact id to attach the run to; defaults to the property's seller contact.Maximum length: 200 |
idempotency_keybody / Optional | string | Your own token for this attempt, 8 to 128 characters. It protects a retry only once the engine has recorded the run: from then on the same key on the same property returns that run instead of dispatching again. A retry within about two minutes is separately refused by the duplicate-address ceiling with a 429 and no charge, but a retry landing between those two windows can still dispatch a second run, so wait for the report rather than retrying blindly. Without a key a retry is only safe within the same half-hour.Minimum length: 8. Maximum length: 128 |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/comps' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"property_id":"00000000-0000-4000-8000-000000000001","confirm_spend":false,"idempotency_key":"example-change-001"}'Request Body
application/json
Request Body - Synthetic Values
{
"property_id": "00000000-0000-4000-8000-000000000001",
"confirm_spend": false,
"idempotency_key": "example-change-001"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- This example deliberately leaves confirm_spend false, so it is refused without dispatching a paid comp. A real confirmed request can cost money. Do not replay an uncertain comp request blindly.
Responses
200 - A requested, duplicate or blocked comp outcome. HTTP 200 does not prove the report completed.
JSON object: status, comp_run_id, property_id. A blocked result additionally includes message, used and limit.
Response Example - Synthetic Values
{
"status": "requested",
"comp_run_id": "00000000-0000-4000-8000-000000000001",
"property_id": "00000000-0000-4000-8000-000000000001"
}- Synthetic requested outcome only. A blocked response charged nothing; the report and billing outcome must be checked separately.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}400 - Spend was not confirmed.
JSON object: error
Response Example - Synthetic Values
{
"error": "confirm_spend_required"
}POST/api/v2/properties/upsertUpsert property
Upsert property
Create a property, or update the one that already exists, in one call. Matching runs in order: property_id, then external_ref, then seller_crm_contact_id (only when no external_ref is sent), then the address (case and outer spaces ignored). More than one match is refused with the candidates, and an address is required to create. Always send your own external_ref per deal: a new one creates a separate deal even for a seller who already has one. Without an external_ref, a match never overwrites a different deal: a seller's property with a different address, or an address's property with a different seller, is 409 ambiguous_match with that property as the candidate and nothing is written. A created property starts at New Deal and is published on your deal page by default; send publish_deal_page false to keep it off. Provided fields overwrite, omitted fields are untouched, and a field is emptied only by naming it in clear. It cannot change the stage (use set_property_stage). Needs the properties:write scope on a scoped key (the account token is refused) and the Properties surface. Sends nothing to your CRM. Use dry_run to check first and idempotency_key to retry safely.
- Required Scope
- properties:write
- Operation Type
- write
- MCP Tool
- upsert_property
- Changes one live record without a draft approval queue. Grant write access only where intended.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
property_idbody / Optional | uuid | Update this property. A property is never created when property_id is given; one that is not in this account is not found. |
external_refbody / Optional | string | Your own reference for the property, unique in the account: 1 to 128 characters of letters, digits and . _ : / - .Maximum length: 128 |
addressbody / Optional | string | Street address, 1 to 300 characters. Required to create a property; cannot be blanked.Maximum length: 300 |
streetbody / Optional | string | Street line.Maximum length: 200 |
citybody / Optional | string | City.Maximum length: 100 |
statebody / Optional | string | State.Maximum length: 50 |
zipbody / Optional | string | Postal code.Maximum length: 20 |
apnbody / Optional | string | Assessor parcel number.Maximum length: 100 |
seller_crm_contact_idbody / Optional | string | The seller's contact id in your CRM: 1 to 128 letters, digits, hyphens or underscores. Also keeps the workfile's seller party in step.Maximum length: 128 |
exit_typebody / Optional | string | Exit type, free text (Assignment, Double Close, Novation, Wholetail, Fix & Flip, Buy & Hold are the app's suggestions).Maximum length: 100 |
source_typebody / Optional | enum | Deal source. On create it is inferred as jv_deal when JV fields are sent.Allowed: own_contract, jv_deal |
jv_contact_idbody / Optional | string | The JV partner's contact id in your CRM: 1 to 128 letters, digits, hyphens or underscores.Maximum length: 128 |
jv_split_pctbody / Optional | number | JV split percent, 0 to 100.Minimum: 0. Maximum: 100 |
contract_pricebody / Optional | number | Contract price (what you pay the seller). Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
asking_pricebody / Optional | number | Asking price. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
arvbody / Optional | number | After-repair value. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
repair_estimatebody / Optional | number | Repair estimate. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
assignment_fee_targetbody / Optional | number | Target assignment fee (the actual fee is recorded with set_property_stage or update_transaction). Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
purchase_emd_amountbody / Optional | number | Seller-side purchase EMD amount. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
mls_list_pricebody / Optional | number | MLS list price. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
purchase_closing_datebody / Optional | day | Purchase closing date. Keeps the active workfile's first closing date in step and moves task due dates, as in the app. |
contract_inspection_end_datebody / Optional | day | Seller-side inspection end date. Moves task due dates, as in the app. |
mls_list_datebody / Optional | day | MLS list date. |
contract_datebody / Optional | day | Contract date. |
close_datebody / Optional | day | Close date. Keeps the active workfile's first closing date in step, as in the app. |
listed_on_mlsbody / Optional | boolean | Whether the property is listed on the MLS. |
mls_numberbody / Optional | string | MLS number.Maximum length: 100 |
bedsbody / Optional | number | Bedrooms, 0 to 100.Minimum: 0. Maximum: 100 |
bathsbody / Optional | number | Bathrooms, 0 to 100.Minimum: 0. Maximum: 100 |
sqftbody / Optional | integer | Square feet, 0 to 1000000.Minimum: 0. Maximum: 1000000 |
year_builtbody / Optional | integer | Year built, 1600 to 2100.Minimum: 1600. Maximum: 2100 |
title_companybody / Optional | string | The property's title company (the workfile has its own, set with update_transaction).Maximum length: 200 |
notes_appendbody / Optional | string | Text appended to the property notes as a timestamped block, 1 to 4000 characters. Notes are never overwritten. A real write needs an idempotency_key; a dry run does not.Maximum length: 4000 |
publish_deal_pagebody / Optional | boolean | Create only, default true: a created property is published on your deal page like every other creation path. Send false to keep it unpublished. Ignored when an existing property is updated. |
expected_updated_atbody / Optional | datetime | Optional guard: the property's updated_at exactly as your last read returned it. If it changed since, the call is refused with stale_record and nothing is written. |
clearbody / Optional | enum_array | Names of property fields to empty. Only these fields can be emptied; a field cannot be both set and cleared in one call. On REST an explicit JSON null does the same.Allowed: external_ref, street, city, state, zip, apn, seller_crm_contact_id, exit_type, jv_contact_id, jv_split_pct, contract_price, asking_price, arv, repair_estimate, assignment_fee_target, purchase_emd_amount, mls_list_price, purchase_closing_date, contract_inspection_end_date, mls_list_date, contract_date, close_date, mls_number, beds, baths, sqft, year_built, title_company. Maximum items: 28 |
dry_runbody / Optional | boolean | true runs every check and returns what would happen, then rolls everything back: nothing is written or sent. It still counts toward rate limits. |
idempotency_keybody / Optional | string | Required on a real write that sends notes_append, because it appends each time it is applied; a dry run does not need one. Your own token for this change, 8 to 128 characters of letters, digits and . _ : - . The same key with the same arguments returns the first answer with replayed true and changes nothing; the same key with different arguments is refused. Kept 30 days.Minimum length: 8. Maximum length: 128 |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/properties/upsert' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"address":"123 Example St, Example City, TX 78701","external_ref":"example-deal-001","publish_deal_page":false,"dry_run":true,"idempotency_key":"example-change-001"}'Request Body
application/json
Request Body - Synthetic Values
{
"address": "123 Example St, Example City, TX 78701",
"external_ref": "example-deal-001",
"publish_deal_page": false,
"dry_run": true,
"idempotency_key": "example-change-001"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- Example uses dry_run true, so checks roll back. Use a unique idempotency key for one intended change; do not reuse it for different arguments.
Responses
200 - Source-defined write result; dry_run checks without saving.
JSON object: status, operation, dry_run, replayed, request_id, changed, changes and operation-specific property, transaction, task or party records; matched_by and side_effects where relevant. Read scopes can remove record sections.
Response Excerpt - Synthetic Values
{
"dry_run": true,
"replayed": false,
"request_id": "00000000-0000-4000-8000-000000000001"
}- Excerpt shows only common fields. Read the returned record and changed list; do not infer delivery from a write result.
400 - A parameter or body value is invalid.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "bad_request",
"message": "The request is malformed or breaks a field rule.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "unauthorized",
"message": "The credential is missing, wrong, expired, revoked, or not allowed to do this.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
404 - No record visible to this credential.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "not_found",
"message": "That record was not found in this account.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
409 - The record changed or its state does not permit this change.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "conflict",
"message": "The request is valid, but the record's current state does not allow it.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
429 - A request limit was exceeded.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "rate_limited",
"message": "Too many requests. Wait a moment and retry.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
502 - An upstream response could not be used.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "upstream",
"message": "Something went wrong on our side. Retry with the same idempotency key.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
503 - The service or a required dependency is unavailable.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "unavailable",
"message": "A dependency is temporarily unavailable. Retry shortly.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
POST/api/v2/properties/{property_id}/updateUpdate property
Update property
Update fields on one property. Provided fields overwrite, omitted fields are untouched, and a field is emptied only by naming it in clear; at least one field, a clear, or a notes_append is required. A hidden built-in field is refused. It cannot change the stage (use set_property_stage). Needs the properties:write scope on a scoped key (the account token is refused) and the Properties surface. Sends nothing to your CRM. Use dry_run to check first and idempotency_key to retry safely.
- Required Scope
- properties:write
- Operation Type
- write
- MCP Tool
- update_property
- Changes one live record without a draft approval queue. Grant write access only where intended.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
property_idpath / Required | uuid | Property UUID; must belong to the authenticated client. |
external_refbody / Optional | string | Your own reference for the property, unique in the account: 1 to 128 characters of letters, digits and . _ : / - .Maximum length: 128 |
addressbody / Optional | string | Street address, 1 to 300 characters. Required to create a property; cannot be blanked.Maximum length: 300 |
streetbody / Optional | string | Street line.Maximum length: 200 |
citybody / Optional | string | City.Maximum length: 100 |
statebody / Optional | string | State.Maximum length: 50 |
zipbody / Optional | string | Postal code.Maximum length: 20 |
apnbody / Optional | string | Assessor parcel number.Maximum length: 100 |
seller_crm_contact_idbody / Optional | string | The seller's contact id in your CRM: 1 to 128 letters, digits, hyphens or underscores. Also keeps the workfile's seller party in step.Maximum length: 128 |
exit_typebody / Optional | string | Exit type, free text (Assignment, Double Close, Novation, Wholetail, Fix & Flip, Buy & Hold are the app's suggestions).Maximum length: 100 |
source_typebody / Optional | enum | Deal source. On create it is inferred as jv_deal when JV fields are sent.Allowed: own_contract, jv_deal |
jv_contact_idbody / Optional | string | The JV partner's contact id in your CRM: 1 to 128 letters, digits, hyphens or underscores.Maximum length: 128 |
jv_split_pctbody / Optional | number | JV split percent, 0 to 100.Minimum: 0. Maximum: 100 |
contract_pricebody / Optional | number | Contract price (what you pay the seller). Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
asking_pricebody / Optional | number | Asking price. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
arvbody / Optional | number | After-repair value. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
repair_estimatebody / Optional | number | Repair estimate. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
assignment_fee_targetbody / Optional | number | Target assignment fee (the actual fee is recorded with set_property_stage or update_transaction). Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
purchase_emd_amountbody / Optional | number | Seller-side purchase EMD amount. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
mls_list_pricebody / Optional | number | MLS list price. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
purchase_closing_datebody / Optional | day | Purchase closing date. Keeps the active workfile's first closing date in step and moves task due dates, as in the app. |
contract_inspection_end_datebody / Optional | day | Seller-side inspection end date. Moves task due dates, as in the app. |
mls_list_datebody / Optional | day | MLS list date. |
contract_datebody / Optional | day | Contract date. |
close_datebody / Optional | day | Close date. Keeps the active workfile's first closing date in step, as in the app. |
listed_on_mlsbody / Optional | boolean | Whether the property is listed on the MLS. |
mls_numberbody / Optional | string | MLS number.Maximum length: 100 |
bedsbody / Optional | number | Bedrooms, 0 to 100.Minimum: 0. Maximum: 100 |
bathsbody / Optional | number | Bathrooms, 0 to 100.Minimum: 0. Maximum: 100 |
sqftbody / Optional | integer | Square feet, 0 to 1000000.Minimum: 0. Maximum: 1000000 |
year_builtbody / Optional | integer | Year built, 1600 to 2100.Minimum: 1600. Maximum: 2100 |
title_companybody / Optional | string | The property's title company (the workfile has its own, set with update_transaction).Maximum length: 200 |
notes_appendbody / Optional | string | Text appended to the property notes as a timestamped block, 1 to 4000 characters. Notes are never overwritten. A real write needs an idempotency_key; a dry run does not.Maximum length: 4000 |
expected_updated_atbody / Optional | datetime | Optional guard: the property's updated_at exactly as your last read returned it. If it changed since, the call is refused with stale_record and nothing is written. |
clearbody / Optional | enum_array | Names of property fields to empty. Only these fields can be emptied; a field cannot be both set and cleared in one call. On REST an explicit JSON null does the same.Allowed: external_ref, street, city, state, zip, apn, seller_crm_contact_id, exit_type, jv_contact_id, jv_split_pct, contract_price, asking_price, arv, repair_estimate, assignment_fee_target, purchase_emd_amount, mls_list_price, purchase_closing_date, contract_inspection_end_date, mls_list_date, contract_date, close_date, mls_number, beds, baths, sqft, year_built, title_company. Maximum items: 28 |
dry_runbody / Optional | boolean | true runs every check and returns what would happen, then rolls everything back: nothing is written or sent. It still counts toward rate limits. |
idempotency_keybody / Optional | string | Required on a real write that sends notes_append, because it appends each time it is applied; a dry run does not need one. Your own token for this change, 8 to 128 characters of letters, digits and . _ : - . The same key with the same arguments returns the first answer with replayed true and changes nothing; the same key with different arguments is refused. Kept 30 days.Minimum length: 8. Maximum length: 128 |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/properties/00000000-0000-4000-8000-000000000001/update' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"address":"123 Example St, Example City, TX 78701","dry_run":true,"idempotency_key":"example-change-001"}'Request Body
application/json
Request Body - Synthetic Values
{
"address": "123 Example St, Example City, TX 78701",
"dry_run": true,
"idempotency_key": "example-change-001"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- Example uses dry_run true, so checks roll back. Use a unique idempotency key for one intended change; do not reuse it for different arguments.
Responses
200 - Source-defined write result; dry_run checks without saving.
JSON object: status, operation, dry_run, replayed, request_id, changed, changes and operation-specific property, transaction, task or party records; matched_by and side_effects where relevant. Read scopes can remove record sections.
Response Excerpt - Synthetic Values
{
"dry_run": true,
"replayed": false,
"request_id": "00000000-0000-4000-8000-000000000001"
}- Excerpt shows only common fields. Read the returned record and changed list; do not infer delivery from a write result.
400 - A parameter or body value is invalid.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "bad_request",
"message": "The request is malformed or breaks a field rule.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "unauthorized",
"message": "The credential is missing, wrong, expired, revoked, or not allowed to do this.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
404 - No record visible to this credential.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "not_found",
"message": "That record was not found in this account.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
409 - The record changed or its state does not permit this change.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "conflict",
"message": "The request is valid, but the record's current state does not allow it.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
429 - A request limit was exceeded.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "rate_limited",
"message": "Too many requests. Wait a moment and retry.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
502 - An upstream response could not be used.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "upstream",
"message": "Something went wrong on our side. Retry with the same idempotency key.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
503 - The service or a required dependency is unavailable.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "unavailable",
"message": "A dependency is temporarily unavailable. Retry shortly.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
POST/api/v2/properties/{property_id}/stageSet property stage
Set property stage
Move one property to any of the 17 stages a person can set by hand in the app, backward moves included (list_property_stages shows them and why one is blocked). Buyer EMD through Closed need an accepted offer with EMD received, which stays with a person. Fell Through needs reason, fall_through_category and fall_through_attribution. buyer_id records the buyer on the workfile and assignment_fee the actual fee. Scope: properties:write on a scoped key (the account token is refused) and the Properties surface, plus transactions:write on the same key and the Transactions surface when buyer_id, assignment_fee or note is sent. A real stage change adds the same internal seller note and seller tag (closed deal or lost deal) in your LeadAttractor CRM that a hand change adds, and sends the same internal team email; side_effects reports what happened. Nothing is sent on a dry run, a replay, an unchanged stage or a refusal, a failed send never undoes the move, and your deal pipeline is not synced. Use dry_run to check first and idempotency_key to retry safely. A real write with a note needs an idempotency_key.
- Required Scope
- properties:write
- Operation Type
- write
- MCP Tool
- set_property_stage
- Changes one live record without a draft approval queue. Grant write access only where intended.
- A real stage change can add seller CRM notes/tags and notify the deal team. Additional transactions:write is required when buyer_id, assignment_fee or note is supplied.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
property_idpath / Required | uuid | Property UUID; must belong to the authenticated client. |
stagebody / Required | enum | The stage to move to.Allowed: new_deal, audit, intro_setup, seller_emd, inspection, renegotiating, marketing, buyer_lined_up, assignment_executed, double_close_set, buyer_emd, pre_closing, clear_to_close, closing, closed, fell_through, dead |
expected_stagebody / Optional | enum | Optional guard: the stage you believe the property is at. If it differs, the call is refused with stale_stage and the current stage.Allowed: new_deal, audit, intro_setup, seller_emd, inspection, renegotiating, marketing, buyer_lined_up, assignment_executed, double_close_set, buyer_emd, pre_closing, clear_to_close, closing, closed, fell_through, dead |
expected_updated_atbody / Optional | datetime | Optional guard: the property's updated_at exactly as your last read returned it. If it changed since, the call is refused with stale_record and nothing is written. |
reasonbody / Optional | string | The full explanation, 1 to 10000 characters. Required for fell_through; optional for other stages.Maximum length: 10000 |
fall_through_categorybody / Optional | enum | Required for fell_through, refused for any other stage.Allowed: buyer_financing_or_proof_of_funds_failure, buyer_withdrew_or_stopped_responding, buyer_renegotiated, seller_issue, title_or_legal_issue, inspection_or_property_condition_issue, appraisal_or_valuation_issue, closing_or_timeline_delay, assignment_or_competing_offer_issue, other |
fall_through_attributionbody / Optional | enum | Who or what caused the fall-through. Required for fell_through, refused for any other stage.Allowed: buyer, seller, title_or_legal, property, operator_or_platform, unknown |
fall_through_buyer_idbody / Optional | uuid | Required exactly when fall_through_attribution is buyer; that buyer must have an offer on this deal. |
buyer_idbody / Optional | uuid | Buyer UUID to record on the workfile as its buyer party. Allowed with buyer_lined_up, assignment_executed, double_close_set, buyer_emd, pre_closing, clear_to_close, closing and closed. Needs transactions:write. |
assignment_feebody / Optional | number | Actual assignment fee, written to the workfile's gross_assignment_fee. Same stages as buyer_id. Needs transactions:write. The target fee is assignment_fee_target on update_property. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
notebody / Optional | string | One manual entry for the workfile communication log, 1 to 4000 characters. Needs transactions:write, and an idempotency_key on a real write (not on a dry run).Maximum length: 4000 |
dry_runbody / Optional | boolean | true runs every check and returns what would happen, then rolls everything back: nothing is written or sent. It still counts toward rate limits. |
idempotency_keybody / Optional | string | Required on a real write that sends note, because it appends each time it is applied; a dry run does not need one. Your own token for this change, 8 to 128 characters of letters, digits and . _ : - . The same key with the same arguments returns the first answer with replayed true and changes nothing; the same key with different arguments is refused. Kept 30 days.Minimum length: 8. Maximum length: 128 |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/properties/00000000-0000-4000-8000-000000000001/stage' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"stage":"new_deal","dry_run":true,"idempotency_key":"example-change-001"}'Request Body
application/json
Request Body - Synthetic Values
{
"stage": "new_deal",
"dry_run": true,
"idempotency_key": "example-change-001"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- Example uses dry_run true, so checks roll back. Use a unique idempotency key for one intended change; do not reuse it for different arguments.
Responses
200 - Source-defined write result; dry_run checks without saving.
JSON object: status, operation, dry_run, replayed, request_id, changed, changes and operation-specific property, transaction, task or party records; matched_by and side_effects where relevant. Read scopes can remove record sections.
Response Excerpt - Synthetic Values
{
"dry_run": true,
"replayed": false,
"request_id": "00000000-0000-4000-8000-000000000001"
}- Excerpt shows only common fields. Read the returned record and changed list; do not infer delivery from a write result.
400 - A parameter or body value is invalid.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "bad_request",
"message": "The request is malformed or breaks a field rule.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "unauthorized",
"message": "The credential is missing, wrong, expired, revoked, or not allowed to do this.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
404 - No record visible to this credential.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "not_found",
"message": "That record was not found in this account.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
409 - The record changed or its state does not permit this change.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "conflict",
"message": "The request is valid, but the record's current state does not allow it.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
429 - A request limit was exceeded.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "rate_limited",
"message": "Too many requests. Wait a moment and retry.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
502 - An upstream response could not be used.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "upstream",
"message": "Something went wrong on our side. Retry with the same idempotency key.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
503 - The service or a required dependency is unavailable.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "unavailable",
"message": "A dependency is temporarily unavailable. Retry shortly.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
POST/api/v2/properties/{property_id}/ownersSet property owner
Set property owner
Set or clear one deal owner (acq, dispo, followup or tc) on a property's active workfile. Name the person by profile_id or email (list_team_members returns both), or send clear_role true to empty the role. The person must be an active member of the account. Setting tc or acq reassigns that workfile's default tasks, as in the app. A workfile that is closed, fell through or was cancelled is read-only. Needs the transactions:write scope and the Transactions surface. Sends nothing to your CRM. Use dry_run to check first and idempotency_key to retry safely.
- Required Scope
- transactions:write
- Operation Type
- write
- MCP Tool
- set_property_owner
- Changes one live record without a draft approval queue. Grant write access only where intended.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
property_idpath / Required | uuid | Property UUID; must belong to the authenticated client. |
rolebody / Required | enum | The deal role to set or clear.Allowed: acq, dispo, followup, tc |
profile_idbody / Optional | uuid | The person's profile id. Send exactly one of profile_id, email or clear_role. |
emailbody / Optional | string | The person's email, matched ignoring case and outer spaces. Send exactly one of profile_id, email or clear_role.Maximum length: 254 |
clear_rolebody / Optional | boolean | true removes the owner from the role. Send exactly one of profile_id, email or clear_role. |
reasonbody / Optional | string | Optional reason, up to 500 characters; stored in the role history.Maximum length: 500 |
dry_runbody / Optional | boolean | true runs every check and returns what would happen, then rolls everything back: nothing is written or sent. It still counts toward rate limits. |
idempotency_keybody / Optional | string | Your own token for this change, 8 to 128 characters of letters, digits and . _ : - . The same key with the same arguments returns the first answer with replayed true and changes nothing; the same key with different arguments is refused. Kept 30 days.Minimum length: 8. Maximum length: 128 |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/properties/00000000-0000-4000-8000-000000000001/owners' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"role":"acq","clear_role":true,"dry_run":true,"idempotency_key":"example-change-001"}'Request Body
application/json
Request Body - Synthetic Values
{
"role": "acq",
"clear_role": true,
"dry_run": true,
"idempotency_key": "example-change-001"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- Example uses dry_run true, so checks roll back. Use a unique idempotency key for one intended change; do not reuse it for different arguments.
Responses
200 - Source-defined write result; dry_run checks without saving.
JSON object: status, operation, dry_run, replayed, request_id, changed, changes and operation-specific property, transaction, task or party records; matched_by and side_effects where relevant. Read scopes can remove record sections.
Response Excerpt - Synthetic Values
{
"dry_run": true,
"replayed": false,
"request_id": "00000000-0000-4000-8000-000000000001"
}- Excerpt shows only common fields. Read the returned record and changed list; do not infer delivery from a write result.
400 - A parameter or body value is invalid.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "bad_request",
"message": "The request is malformed or breaks a field rule.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "unauthorized",
"message": "The credential is missing, wrong, expired, revoked, or not allowed to do this.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
404 - No record visible to this credential.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "not_found",
"message": "That record was not found in this account.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
409 - The record changed or its state does not permit this change.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "conflict",
"message": "The request is valid, but the record's current state does not allow it.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
429 - A request limit was exceeded.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "rate_limited",
"message": "Too many requests. Wait a moment and retry.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
502 - An upstream response could not be used.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "upstream",
"message": "Something went wrong on our side. Retry with the same idempotency key.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
503 - The service or a required dependency is unavailable.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "unavailable",
"message": "A dependency is temporarily unavailable. Retry shortly.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
POST/api/v2/transactions/{transaction_id}/tasks/{task_id}/reopenReopen transaction task
Reopen transaction task
Move a done task, or a task marked not applicable, back to pending on one active transaction workfile. A done task loses its completion time and person. A pending task is unchanged. Reopening never moves the property's stage back. Needs the transactions:write scope and the Transactions surface. Sends nothing to your CRM. Use dry_run to check first and idempotency_key to retry safely.
- Required Scope
- transactions:write
- Operation Type
- write
- MCP Tool
- reopen_transaction_task
- Changes one live record without a draft approval queue. Grant write access only where intended.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
transaction_idpath / Required | uuid | Transaction UUID the task belongs to; must belong to the authenticated client. |
task_idpath / Required | uuid | Checklist task UUID to reopen; must belong to the named transaction. |
notesbody / Optional | string | Note to store on the task, at most 4000 characters; omitting it leaves the existing note untouched.Maximum length: 4000 |
dry_runbody / Optional | boolean | true runs every check and returns what would happen, then rolls everything back: nothing is written or sent. It still counts toward rate limits. |
idempotency_keybody / Optional | string | Your own token for this change, 8 to 128 characters of letters, digits and . _ : - . The same key with the same arguments returns the first answer with replayed true and changes nothing; the same key with different arguments is refused. Kept 30 days.Minimum length: 8. Maximum length: 128 |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/transactions/00000000-0000-4000-8000-000000000001/tasks/00000000-0000-4000-8000-000000000001/reopen' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"dry_run":true,"idempotency_key":"example-change-001"}'Request Body
application/json
Request Body - Synthetic Values
{
"dry_run": true,
"idempotency_key": "example-change-001"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- Example uses dry_run true, so checks roll back. Use a unique idempotency key for one intended change; do not reuse it for different arguments.
Responses
200 - Source-defined write result; dry_run checks without saving.
JSON object: status, operation, dry_run, replayed, request_id, changed, changes and operation-specific property, transaction, task or party records; matched_by and side_effects where relevant. Read scopes can remove record sections.
Response Excerpt - Synthetic Values
{
"dry_run": true,
"replayed": false,
"request_id": "00000000-0000-4000-8000-000000000001"
}- Excerpt shows only common fields. Read the returned record and changed list; do not infer delivery from a write result.
400 - A parameter or body value is invalid.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "bad_request",
"message": "The request is malformed or breaks a field rule.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "unauthorized",
"message": "The credential is missing, wrong, expired, revoked, or not allowed to do this.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
404 - No record visible to this credential.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "not_found",
"message": "That record was not found in this account.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
409 - The record changed or its state does not permit this change.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "conflict",
"message": "The request is valid, but the record's current state does not allow it.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
429 - A request limit was exceeded.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "rate_limited",
"message": "Too many requests. Wait a moment and retry.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
502 - An upstream response could not be used.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "upstream",
"message": "Something went wrong on our side. Retry with the same idempotency key.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
503 - The service or a required dependency is unavailable.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "unavailable",
"message": "A dependency is temporarily unavailable. Retry shortly.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
POST/api/v2/transactions/{transaction_id}/tasks/{task_id}/not-applicableSet transaction task not applicable
Set transaction task not applicable
Mark one checklist task not applicable on an active transaction workfile, or undo that mark with not_applicable false. A pending or done task can be marked (a done task loses its completion time and person); undoing moves it back to pending. A not-applicable task does not block the next stage, and marking one never advances the stage. Needs the transactions:write scope and the Transactions surface. Sends nothing to your CRM. Use dry_run to check first and idempotency_key to retry safely.
- Required Scope
- transactions:write
- Operation Type
- write
- MCP Tool
- set_transaction_task_not_applicable
- Changes one live record without a draft approval queue. Grant write access only where intended.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
transaction_idpath / Required | uuid | Transaction UUID the task belongs to; must belong to the authenticated client. |
task_idpath / Required | uuid | Checklist task UUID; must belong to the named transaction. |
not_applicablebody / Required | boolean | true marks the task not applicable; false undoes the mark. |
notesbody / Optional | string | Note to store on the task, at most 4000 characters; omitting it leaves the existing note untouched.Maximum length: 4000 |
dry_runbody / Optional | boolean | true runs every check and returns what would happen, then rolls everything back: nothing is written or sent. It still counts toward rate limits. |
idempotency_keybody / Optional | string | Your own token for this change, 8 to 128 characters of letters, digits and . _ : - . The same key with the same arguments returns the first answer with replayed true and changes nothing; the same key with different arguments is refused. Kept 30 days.Minimum length: 8. Maximum length: 128 |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/transactions/00000000-0000-4000-8000-000000000001/tasks/00000000-0000-4000-8000-000000000001/not-applicable' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"not_applicable":true,"dry_run":true,"idempotency_key":"example-change-001"}'Request Body
application/json
Request Body - Synthetic Values
{
"not_applicable": true,
"dry_run": true,
"idempotency_key": "example-change-001"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- Example uses dry_run true, so checks roll back. Use a unique idempotency key for one intended change; do not reuse it for different arguments.
Responses
200 - Source-defined write result; dry_run checks without saving.
JSON object: status, operation, dry_run, replayed, request_id, changed, changes and operation-specific property, transaction, task or party records; matched_by and side_effects where relevant. Read scopes can remove record sections.
Response Excerpt - Synthetic Values
{
"dry_run": true,
"replayed": false,
"request_id": "00000000-0000-4000-8000-000000000001"
}- Excerpt shows only common fields. Read the returned record and changed list; do not infer delivery from a write result.
400 - A parameter or body value is invalid.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "bad_request",
"message": "The request is malformed or breaks a field rule.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "unauthorized",
"message": "The credential is missing, wrong, expired, revoked, or not allowed to do this.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
404 - No record visible to this credential.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "not_found",
"message": "That record was not found in this account.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
409 - The record changed or its state does not permit this change.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "conflict",
"message": "The request is valid, but the record's current state does not allow it.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
429 - A request limit was exceeded.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "rate_limited",
"message": "Too many requests. Wait a moment and retry.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
502 - An upstream response could not be used.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "upstream",
"message": "Something went wrong on our side. Retry with the same idempotency key.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
503 - The service or a required dependency is unavailable.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "unavailable",
"message": "A dependency is temporarily unavailable. Retry shortly.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
POST/api/v2/transactions/{transaction_id}/tasks/{task_id}/assigneeAssign transaction task
Assign transaction task
Assign one checklist task on an active transaction workfile to a person, or unassign it. Send exactly one of assignee_profile_id, assignee_email, assignee_option (from list_transaction_task_assignees; the way to name a CRM user) or unassign true. Only people the app offers as task assignees can be chosen, and the assignee list must load completely or the call is refused as unavailable. The task is marked as manually assigned, so later owner changes do not move it. Needs the transactions:write scope and the Transactions surface. Sends nothing to your CRM. Use dry_run to check first and idempotency_key to retry safely.
- Required Scope
- transactions:write
- Operation Type
- write
- MCP Tool
- assign_transaction_task
- Changes one live record without a draft approval queue. Grant write access only where intended.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
transaction_idpath / Required | uuid | Transaction UUID the task belongs to; must belong to the authenticated client. |
task_idpath / Required | uuid | Checklist task UUID; must belong to the named transaction. |
assignee_profile_idbody / Optional | uuid | A member's profile id. Send exactly one of assignee_profile_id, assignee_email, assignee_option or unassign. |
assignee_emailbody / Optional | string | A member's email, matched ignoring case and outer spaces. Send exactly one of assignee_profile_id, assignee_email, assignee_option or unassign.Maximum length: 254 |
assignee_optionbody / Optional | string | An option value from list_transaction_task_assignees. Send exactly one of assignee_profile_id, assignee_email, assignee_option or unassign.Maximum length: 300 |
unassignbody / Optional | boolean | true removes the assignee. Send exactly one of assignee_profile_id, assignee_email, assignee_option or unassign. |
dry_runbody / Optional | boolean | true runs every check and returns what would happen, then rolls everything back: nothing is written or sent. It still counts toward rate limits. |
idempotency_keybody / Optional | string | Your own token for this change, 8 to 128 characters of letters, digits and . _ : - . The same key with the same arguments returns the first answer with replayed true and changes nothing; the same key with different arguments is refused. Kept 30 days.Minimum length: 8. Maximum length: 128 |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/transactions/00000000-0000-4000-8000-000000000001/tasks/00000000-0000-4000-8000-000000000001/assignee' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"unassign":true,"dry_run":true,"idempotency_key":"example-change-001"}'Request Body
application/json
Request Body - Synthetic Values
{
"unassign": true,
"dry_run": true,
"idempotency_key": "example-change-001"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- Example uses dry_run true, so checks roll back. Use a unique idempotency key for one intended change; do not reuse it for different arguments.
Responses
200 - Source-defined write result; dry_run checks without saving.
JSON object: status, operation, dry_run, replayed, request_id, changed, changes and operation-specific property, transaction, task or party records; matched_by and side_effects where relevant. Read scopes can remove record sections.
Response Excerpt - Synthetic Values
{
"dry_run": true,
"replayed": false,
"request_id": "00000000-0000-4000-8000-000000000001"
}- Excerpt shows only common fields. Read the returned record and changed list; do not infer delivery from a write result.
400 - A parameter or body value is invalid.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "bad_request",
"message": "The request is malformed or breaks a field rule.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "unauthorized",
"message": "The credential is missing, wrong, expired, revoked, or not allowed to do this.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
404 - No record visible to this credential.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "not_found",
"message": "That record was not found in this account.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
409 - The record changed or its state does not permit this change.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "conflict",
"message": "The request is valid, but the record's current state does not allow it.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
429 - A request limit was exceeded.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "rate_limited",
"message": "Too many requests. Wait a moment and retry.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
502 - An upstream response could not be used.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "upstream",
"message": "Something went wrong on our side. Retry with the same idempotency key.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
503 - The service or a required dependency is unavailable.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "unavailable",
"message": "A dependency is temporarily unavailable. Retry shortly.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
POST/api/v2/transactions/{transaction_id}/updateUpdate transaction
Update transaction
Edit fields on one active transaction workfile: exit strategy, key dates, the EMD record, title contacts, audit flags and the deal economics. Provided fields overwrite, omitted fields are untouched, and a field is emptied only by naming it in clear; at least one field or a clear is required. The first scheduled closing date also sets the property's close and purchase-closing dates, as in the app. The exit strategy locks after a closing event. Clearing deal_expenses stores 0. A workfile that is closed, fell through or was cancelled is read-only. Needs the transactions:write scope and the Transactions surface. Sends nothing to your CRM. Use dry_run to check first and idempotency_key to retry safely.
- Required Scope
- transactions:write
- Operation Type
- write
- MCP Tool
- update_transaction
- Changes one live record without a draft approval queue. Grant write access only where intended.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
transaction_idpath / Required | uuid | Transaction UUID; must belong to the authenticated client. |
exit_strategybody / Optional | enum | Exit strategy. Locked after a closing event.Allowed: wholesale_assignment, double_close, flip, listing, off_market |
ratification_datebody / Optional | day | Ratification date. Moves date-anchored task due dates. |
first_scheduled_closing_datebody / Optional | day | First scheduled closing date. Also sets the property's close and purchase-closing dates. |
second_scheduled_closing_datebody / Optional | day | Second scheduled closing date (second leg of a double close or flip). |
seller_emd_amountbody / Optional | number | Seller EMD amount. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
buyer_emd_amountbody / Optional | number | Buyer EMD amount. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
seller_emd_holderbody / Optional | string | Seller EMD holder.Maximum length: 200 |
buyer_emd_holderbody / Optional | string | Buyer EMD holder.Maximum length: 200 |
seller_emd_deadlinebody / Optional | day | Seller EMD deadline. |
buyer_emd_deadlinebody / Optional | day | Buyer EMD deadline. |
seller_emd_received_atbody / Optional | datetime | When the workfile recorded the seller EMD as received. |
buyer_emd_received_atbody / Optional | datetime | When the workfile recorded the buyer EMD as received. The stage gate in set_property_stage reads the accepted offer's EMD, which stays with a person. |
title_companybody / Optional | string | Workfile title company.Maximum length: 200 |
title_officerbody / Optional | string | Title officer.Maximum length: 200 |
title_phonebody / Optional | string | Title phone.Maximum length: 50 |
title_emailbody / Optional | string | Title email address.Maximum length: 254 |
title_file_numberbody / Optional | string | Title file number.Maximum length: 100 |
title_order_datebody / Optional | day | Title order date. |
title_commitment_datebody / Optional | day | Title commitment date. |
clear_to_close_atbody / Optional | datetime | When clear to close was reached. |
section19_notesbody / Optional | string | Section 19 notes.Maximum length: 10000 |
audit_flagsbody / Optional | object | Booleans for contract_fully_executed, seller_emd_received, buyer_emd_received, title_ordered, clear_to_close_confirmed, merged into the existing flags. Other keys are refused. |
gross_assignment_feebody / Optional | number | Actual gross assignment fee. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
actual_deal_profitbody / Optional | number | Actual deal profit. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
gross_listing_commissionbody / Optional | number | Gross listing commission. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
deal_expensesbody / Optional | number | Deal expenses. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99 |
expected_updated_atbody / Optional | datetime | Optional guard: the workfile's updated_at exactly as your last read returned it. If it changed since, the call is refused with stale_record and nothing is written. |
clearbody / Optional | enum_array | Names of workfile fields to empty. Only these fields can be emptied; a field cannot be both set and cleared in one call. On REST an explicit JSON null does the same.Allowed: ratification_date, first_scheduled_closing_date, second_scheduled_closing_date, seller_emd_amount, buyer_emd_amount, seller_emd_holder, buyer_emd_holder, seller_emd_deadline, buyer_emd_deadline, seller_emd_received_at, buyer_emd_received_at, title_company, title_officer, title_phone, title_email, title_file_number, title_order_date, title_commitment_date, clear_to_close_at, section19_notes, gross_assignment_fee, actual_deal_profit, gross_listing_commission, deal_expenses. Maximum items: 24 |
dry_runbody / Optional | boolean | true runs every check and returns what would happen, then rolls everything back: nothing is written or sent. It still counts toward rate limits. |
idempotency_keybody / Optional | string | Your own token for this change, 8 to 128 characters of letters, digits and . _ : - . The same key with the same arguments returns the first answer with replayed true and changes nothing; the same key with different arguments is refused. Kept 30 days.Minimum length: 8. Maximum length: 128 |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/transactions/00000000-0000-4000-8000-000000000001/update' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"exit_strategy":"wholesale_assignment","dry_run":true,"idempotency_key":"example-change-001"}'Request Body
application/json
Request Body - Synthetic Values
{
"exit_strategy": "wholesale_assignment",
"dry_run": true,
"idempotency_key": "example-change-001"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- Example uses dry_run true, so checks roll back. Use a unique idempotency key for one intended change; do not reuse it for different arguments.
Responses
200 - Source-defined write result; dry_run checks without saving.
JSON object: status, operation, dry_run, replayed, request_id, changed, changes and operation-specific property, transaction, task or party records; matched_by and side_effects where relevant. Read scopes can remove record sections.
Response Excerpt - Synthetic Values
{
"dry_run": true,
"replayed": false,
"request_id": "00000000-0000-4000-8000-000000000001"
}- Excerpt shows only common fields. Read the returned record and changed list; do not infer delivery from a write result.
400 - A parameter or body value is invalid.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "bad_request",
"message": "The request is malformed or breaks a field rule.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "unauthorized",
"message": "The credential is missing, wrong, expired, revoked, or not allowed to do this.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
404 - No record visible to this credential.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "not_found",
"message": "That record was not found in this account.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
409 - The record changed or its state does not permit this change.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "conflict",
"message": "The request is valid, but the record's current state does not allow it.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
429 - A request limit was exceeded.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "rate_limited",
"message": "Too many requests. Wait a moment and retry.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
502 - An upstream response could not be used.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "upstream",
"message": "Something went wrong on our side. Retry with the same idempotency key.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
503 - The service or a required dependency is unavailable.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "unavailable",
"message": "A dependency is temporarily unavailable. Retry shortly.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
POST/api/v2/transactions/{transaction_id}/partiesUpsert transaction party
Upsert transaction party
Create or update one party (seller, buyer, title, escrow, lender, jv_partner, agent or other) on an active transaction workfile. Matching only looks at parties with the same role: party_id first (the only way to change a role), then buyer_id, then email, then crm_contact_id, each only when sent; nothing matching creates a new party, and more than one match is refused with the candidates. Omitted fields keep their values and a field is emptied only by naming it in clear. A real write that sends no party_id, buyer_id, email or crm_contact_id creates a new party every time, so it needs an idempotency_key. crm_contact_id is stored only; nothing is created in your CRM. Needs the transactions:write scope and the Transactions surface. Sends nothing to your CRM. Use dry_run to check first and idempotency_key to retry safely.
- Required Scope
- transactions:write
- Operation Type
- write
- MCP Tool
- upsert_transaction_party
- Changes one live record without a draft approval queue. Grant write access only where intended.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
transaction_idpath / Required | uuid | Transaction UUID; must belong to the authenticated client. |
party_idbody / Optional | uuid | Update this party; one that is not on this workfile is not found. |
rolebody / Optional | enum | The party's role. Required unless party_id is sent; a role change is allowed only together with party_id.Allowed: seller, buyer, title, escrow, lender, jv_partner, agent, other |
namebody / Optional | string | Party name.Maximum length: 200 |
phonebody / Optional | string | Party phone.Maximum length: 50 |
emailbody / Optional | string | Party email address.Maximum length: 254 |
crm_contact_idbody / Optional | string | The party's contact id in your CRM: 1 to 128 letters, digits, hyphens or underscores. Stored only; nothing is created in your CRM.Maximum length: 128 |
buyer_idbody / Optional | uuid | A buyer in this account to link to the party. |
clearbody / Optional | enum_array | Names of party fields to empty. Only these fields can be emptied; a field cannot be both set and cleared in one call. On REST an explicit JSON null does the same.Allowed: name, phone, email, crm_contact_id, buyer_id. Maximum items: 5 |
dry_runbody / Optional | boolean | true runs every check and returns what would happen, then rolls everything back: nothing is written or sent. It still counts toward rate limits. |
idempotency_keybody / Optional | string | Required on a real write that sends no party_id, buyer_id, email or crm_contact_id, because it creates a new party every time it is applied; a dry run does not need one. Your own token for this change, 8 to 128 characters of letters, digits and . _ : - . The same key with the same arguments returns the first answer with replayed true and changes nothing; the same key with different arguments is refused. Kept 30 days.Minimum length: 8. Maximum length: 128 |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/transactions/00000000-0000-4000-8000-000000000001/parties' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"role":"other","name":"Example Party","email":"party@example.com","dry_run":true,"idempotency_key":"example-change-001"}'Request Body
application/json
Request Body - Synthetic Values
{
"role": "other",
"name": "Example Party",
"email": "party@example.com",
"dry_run": true,
"idempotency_key": "example-change-001"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- Example uses dry_run true, so checks roll back. Use a unique idempotency key for one intended change; do not reuse it for different arguments.
Responses
200 - Source-defined write result; dry_run checks without saving.
JSON object: status, operation, dry_run, replayed, request_id, changed, changes and operation-specific property, transaction, task or party records; matched_by and side_effects where relevant. Read scopes can remove record sections.
Response Excerpt - Synthetic Values
{
"dry_run": true,
"replayed": false,
"request_id": "00000000-0000-4000-8000-000000000001"
}- Excerpt shows only common fields. Read the returned record and changed list; do not infer delivery from a write result.
400 - A parameter or body value is invalid.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "bad_request",
"message": "The request is malformed or breaks a field rule.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "unauthorized",
"message": "The credential is missing, wrong, expired, revoked, or not allowed to do this.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
404 - No record visible to this credential.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "not_found",
"message": "That record was not found in this account.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
409 - The record changed or its state does not permit this change.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "conflict",
"message": "The request is valid, but the record's current state does not allow it.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
429 - A request limit was exceeded.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "rate_limited",
"message": "Too many requests. Wait a moment and retry.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
502 - An upstream response could not be used.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "upstream",
"message": "Something went wrong on our side. Retry with the same idempotency key.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
503 - The service or a required dependency is unavailable.
JSON object: error, message, request_id; optional reason and field; certain conflicts include additional record context.
Response Excerpt - Synthetic Values
{
"error": "unavailable",
"message": "A dependency is temporarily unavailable. Retry shortly.",
"request_id": "00000000-0000-4000-8000-000000000001"
}- This is the plain refusal form. Named refusals additionally include reason and, when applicable, field; they use that reason's fixed message.
Buyer Intake
POST/api/v2/buyersIntake-buyer
Intake-buyer
Create or update a buyer from your CRM's stable contact ID. Requires the account API token in Authorization: Bearer. In the reviewed source, a scoped integration credential does not authorize this legacy intake; selecting buyers:write or coaching:write alone is not sufficient. This remains an authenticated account write, not a public endpoint.
- Required Scope
- See authentication and integration-specific notes.
- Operation Type
- intake
- Changes records in the credential's account. Only send events and contact records you are authorized to submit.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
ghl_contact_idbody / Required | string | Your CRM's stable contact identifier. contact_id and contactId are accepted aliases; supply one of them. The legacy field name works with any CRM. |
namebody / Optional | string | Buyer's name. |
emailbody / Optional | string | Email address. |
phonebody / Optional | string | Phone number. |
custom_fieldsbody / Optional | object | Canonical buyer fields or custom values accepted by the intake. |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/buyers' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"ghl_contact_id":"example-contact-001","name":"Example Buyer","email":"buyer@example.com"}'Request Body
application/json
Request Body - Synthetic Values
{
"ghl_contact_id": "example-contact-001",
"name": "Example Buyer",
"email": "buyer@example.com"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- Requires the account API token in Authorization: Bearer. In the reviewed source, a scoped integration credential does not authorize this legacy intake; selecting buyers:write or coaching:write alone is not sufficient. This remains an authenticated account write, not a public endpoint.
- The displayed fields are the common intake fields, not a new strict JSON Schema. Existing intake aliases and custom/display-name fields keep their implemented behavior; see the CRM setup guide for mapping.
Responses
200 - Source-defined result; inspect its status and any per-row results.
JSON object with fields: status, buyer_id.
Response Excerpt - Synthetic Values
{
"buyer_id": "00000000-0000-4000-8000-000000000001"
}- Synthetic result excerpt; status labels and optional row fields depend on the actual result. An empty results array here illustrates the envelope, not the outcome of the example request.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}Property Intake
POST/api/v2/propertiesIntake-property
Intake-property
Fill missing property values or create a property. This legacy intake does not overwrite populated fields or move stages; use the explicit property-management operations for those changes.
- Required Scope
- properties:write
- Operation Type
- intake
- Changes records in the credential's account. Only send events and contact records you are authorized to submit.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
addressbody / Required | string | Property address; required for creation. |
citybody / Optional | string | City. |
statebody / Optional | string | State. |
zipbody / Optional | string | ZIP/postal code. |
seller_ghl_contact_idbody / Optional | string | CRM seller identifier, when known. |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/properties' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"address":"123 Example St, Example City, TX 78701"}'Request Body
application/json
Request Body - Synthetic Values
{
"address": "123 Example St, Example City, TX 78701"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- The displayed fields are the common intake fields, not a new strict JSON Schema. Existing intake aliases and custom/display-name fields keep their implemented behavior; see the CRM setup guide for mapping.
Responses
200 - Source-defined result; inspect its status and any per-row results.
JSON object with fields: status, property_id.
Response Excerpt - Synthetic Values
{
"property_id": "00000000-0000-4000-8000-000000000001"
}- Synthetic result excerpt; status labels and optional row fields depend on the actual result. An empty results array here illustrates the envelope, not the outcome of the example request.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}POST/api/v2/jv-dealsIntake-jv-deal
Intake-jv-deal
Create or update a JV deal, with property and JV details from the allowed intake fields.
- Required Scope
- deals:write
- Operation Type
- intake
- Changes records in the credential's account. Only send events and contact records you are authorized to submit.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
addressbody / Required | string | Property address; required for creation. |
citybody / Optional | string | City. |
statebody / Optional | string | State. |
zipbody / Optional | string | ZIP/postal code. |
seller_ghl_contact_idbody / Optional | string | CRM seller identifier, when known. |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/jv-deals' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"address":"123 Example St, Example City, TX 78701"}'Request Body
application/json
Request Body - Synthetic Values
{
"address": "123 Example St, Example City, TX 78701"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- The displayed fields are the common intake fields, not a new strict JSON Schema. Existing intake aliases and custom/display-name fields keep their implemented behavior; see the CRM setup guide for mapping.
Responses
200 - Source-defined result; inspect its status and any per-row results.
JSON object with fields: status, property_id, jv_deal_details_id.
Response Excerpt - Synthetic Values
{
"property_id": "00000000-0000-4000-8000-000000000001",
"jv_deal_details_id": "00000000-0000-4000-8000-000000000001"
}- Synthetic result excerpt; status labels and optional row fields depend on the actual result. An empty results array here illustrates the envelope, not the outcome of the example request.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}CRM Adapters
POST/api/v2/ghl/buyerGhl-buyer-intake
Ghl-buyer-intake
Receive a GoHighLevel workflow payload and map contact fields into buyer intake. Use top-level snake_case contact fields and supported display-name buy-box fields. The credential, not a location in the payload, selects the account. Requires the account API token in Authorization: Bearer. In the reviewed source, a scoped integration credential does not authorize this legacy intake; selecting buyers:write or coaching:write alone is not sufficient. This remains an authenticated account write, not a public endpoint.
- Required Scope
- See authentication and integration-specific notes.
- Operation Type
- intake
- Changes records in the credential's account. Only send events and contact records you are authorized to submit.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
contact_idbody / Required | string | GoHighLevel contact ID, mapped to the stable intake contact ID. |
full_namebody / Optional | string | Buyer name. |
emailbody / Optional | string | Buyer email. |
phonebody / Optional | string | Buyer phone. |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/ghl/buyer' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"contact_id":"example-contact-001","full_name":"Example Buyer","email":"buyer@example.com"}'Request Body
application/json
Request Body - Synthetic Values
{
"contact_id": "example-contact-001",
"full_name": "Example Buyer",
"email": "buyer@example.com"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- Requires the account API token in Authorization: Bearer. In the reviewed source, a scoped integration credential does not authorize this legacy intake; selecting buyers:write or coaching:write alone is not sufficient. This remains an authenticated account write, not a public endpoint.
- The displayed fields are the common intake fields, not a new strict JSON Schema. Existing intake aliases and custom/display-name fields keep their implemented behavior; see the CRM setup guide for mapping.
Responses
200 - Source-defined result; inspect its status and any per-row results.
JSON object with fields: status, buyer_id.
Response Excerpt - Synthetic Values
{
"buyer_id": "00000000-0000-4000-8000-000000000001"
}- Synthetic result excerpt; status labels and optional row fields depend on the actual result. An empty results array here illustrates the envelope, not the outcome of the example request.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}POST/api/v2/ghl/propertyGhl-property-intake
Ghl-property-intake
Receive and map a GoHighLevel property workflow payload into the legacy property intake. address1 is preferred over full_address; city, state, postal_code and contact_id are mapped from top-level values.
- Required Scope
- properties:write
- Operation Type
- intake
- Changes records in the credential's account. Only send events and contact records you are authorized to submit.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
address1body / Required | string | Property address; full_address is an accepted fallback. |
full_addressbody / Optional | string | Fallback when address1 is absent. |
postal_codebody / Optional | string | ZIP/postal code. |
contact_idbody / Optional | string | Seller CRM contact ID. |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/ghl/property' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"address1":"123 Example St","city":"Example City","state":"TX","postal_code":"78701"}'Request Body
application/json
Request Body - Synthetic Values
{
"address1": "123 Example St",
"city": "Example City",
"state": "TX",
"postal_code": "78701"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- The displayed fields are the common intake fields, not a new strict JSON Schema. Existing intake aliases and custom/display-name fields keep their implemented behavior; see the CRM setup guide for mapping.
Responses
200 - Source-defined result; inspect its status and any per-row results.
JSON object with fields: status, property_id.
Response Excerpt - Synthetic Values
{
"property_id": "00000000-0000-4000-8000-000000000001"
}- Synthetic result excerpt; status labels and optional row fields depend on the actual result. An empty results array here illustrates the envelope, not the outcome of the example request.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}POST/api/v2/ghl/kpiRecord-kpi
Record-kpi
Record a KPI or rep-confirmed call disposition. A dial KPI event alone does not populate the dashboard dial counter; call events do. The adapter derives disposition deduplication from normalized event/call/contact identity and time; do not invent a dedupe_key field.
- Required Scope
- kpi:write
- Operation Type
- intake
- Changes records in the credential's account. Only send events and contact records you are authorized to submit.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
x-kpi-typeheader / Required | enum | KPI event type.Allowed: new_seller_lead, pass_off, process_call, dial, call_connected, call_disposition, touch, quality_touch |
contact_idbody / Optional | string | Stable CRM contact ID used for deduplication. |
eventIdbody / Optional | string | Stable external event identifier, when known. |
messageIdbody / Optional | string | CRM message identifier, when known. |
callIdbody / Optional | string | Stable call identifier, when known. |
dispositionbody / Optional | string | Rep-confirmed outcome for a call disposition. |
occurred_atbody / Optional | datetime | Event time, when supplied. |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/ghl/kpi' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'x-kpi-type: new_seller_lead' \
--header 'Content-Type: application/json' \
--data '{"contact_id":"example-contact-001"}'Request Body
application/json
Request Body - Synthetic Values
{
"contact_id": "example-contact-001"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
Responses
200 - Source-defined result; inspect its status and any per-row results.
JSON object with fields: recorded, reason.
Response Excerpt - Synthetic Values
{
"recorded": false,
"reason": "duplicate"
}- Synthetic result excerpt; status labels and optional row fields depend on the actual result. An empty results array here illustrates the envelope, not the outcome of the example request.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}POST/api/connector/kpiKpi-connector-alias
Kpi-connector-alias
Compatibility alias. Record a KPI or rep-confirmed call disposition. A dial KPI event alone does not populate the dashboard dial counter; call events do. The adapter derives disposition deduplication from normalized event/call/contact identity and time; do not invent a dedupe_key field.
- Required Scope
- kpi:write
- Operation Type
- intake
- Changes records in the credential's account. Only send events and contact records you are authorized to submit.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
x-kpi-typeheader / Required | enum | KPI event type.Allowed: new_seller_lead, pass_off, process_call, dial, call_connected, call_disposition, touch, quality_touch |
contact_idbody / Optional | string | Stable CRM contact ID used for deduplication. |
eventIdbody / Optional | string | Stable external event identifier, when known. |
messageIdbody / Optional | string | CRM message identifier, when known. |
callIdbody / Optional | string | Stable call identifier, when known. |
dispositionbody / Optional | string | Rep-confirmed outcome for a call disposition. |
occurred_atbody / Optional | datetime | Event time, when supplied. |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/connector/kpi' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'x-kpi-type: new_seller_lead' \
--header 'Content-Type: application/json' \
--data '{"contact_id":"example-contact-001"}'Request Body
application/json
Request Body - Synthetic Values
{
"contact_id": "example-contact-001"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
Responses
200 - Source-defined result; inspect its status and any per-row results.
JSON object with fields: recorded, reason.
Response Excerpt - Synthetic Values
{
"recorded": false,
"reason": "duplicate"
}- Synthetic result excerpt; status labels and optional row fields depend on the actual result. An empty results array here illustrates the envelope, not the outcome of the example request.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}Lead Intake
GET/api/v2/voice-campaigns/{campaignId}/leadsList-campaign-leads
List-campaign-leads
List leads in one voice campaign. This is separate from account-wide lead reads requiring leads:read_all. It does not take the account-wide state/search filters.
- Required Scope
- leads:read
- Operation Type
- read
- Read-only.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
campaignIdpath / Required | uuid | Voice campaign in your account. |
limitquery / Optional | integer | Page size, default 100; values are clamped server-side.Minimum: 1. Maximum: 500 |
offsetquery / Optional | integer | Zero-based offset, default 0.Minimum: 0 |
Request Example - Replace Synthetic Values
curl --request GET 'https://app.closemagnet.com/api/v2/voice-campaigns/00000000-0000-4000-8000-000000000001/leads?limit=25' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN"Responses
200 - Campaign lead collection.
JSON object with leads, limit and offset. There is no total field.
Response Example - Synthetic Values
{
"leads": [],
"limit": 100,
"offset": 0
}- Synthetic valid empty campaign lead page.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}POST/api/v2/voice-campaigns/{campaignId}/leadsUpsert-campaign-lead
Upsert-campaign-lead
Add or update a lead by campaign and normalized phone. Repeating an intake can re-arm a lead; it is not a harmless status check.
- Required Scope
- leads:write
- Operation Type
- intake
- Changes records in the credential's account. Only send events and contact records you are authorized to submit.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
campaignIdpath / Required | uuid | Voice campaign in your account. |
phone_numberbody / Required | string | Phone number, normalized to E.164. At least 10 digits after normalization. |
first_namebody / Optional | string | First name. |
last_namebody / Optional | string | Last name. |
emailbody / Optional | string | Email address. |
custom_fieldsbody / Optional | object | Custom scalar values. Reserved identity/admin/role keys are removed. |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/voice-campaigns/00000000-0000-4000-8000-000000000001/leads' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"phone_number":"+12025550123","first_name":"Example","custom_fields":{}}'Request Body
application/json
Request Body - Synthetic Values
{
"phone_number": "+12025550123",
"first_name": "Example",
"custom_fields": {}
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- Maximum JSON body: 512 KiB, maximum structural nesting depth 64. A bulk request is a JSON array with at most 1,000 rows.
Responses
200 - Source-defined result; inspect its status and any per-row results.
JSON object with fields: status, lead_id.
Response Excerpt - Synthetic Values
{
"lead_id": "00000000-0000-4000-8000-000000000001"
}- Synthetic result excerpt; status labels and optional row fields depend on the actual result. An empty results array here illustrates the envelope, not the outcome of the example request.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}DELETE/api/v2/voice-campaigns/{campaignId}/leadsRemove-campaign-lead
Remove-campaign-lead
Remove one lead by phone in the JSON body, not by a lead ID in the URL.
- Required Scope
- leads:write
- Operation Type
- intake
- Changes records in the credential's account. Only send events and contact records you are authorized to submit.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
campaignIdpath / Required | uuid | Voice campaign in your account. |
phone_numberbody / Required | string | Phone number, normalized to E.164. At least 10 digits after normalization. |
Request Example - Replace Synthetic Values
curl --request DELETE 'https://app.closemagnet.com/api/v2/voice-campaigns/00000000-0000-4000-8000-000000000001/leads' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"phone_number":"+12025550123"}'Request Body
application/json
Request Body - Synthetic Values
{
"phone_number": "+12025550123"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- Maximum JSON body: 512 KiB, maximum structural nesting depth 64. A bulk request is a JSON array with at most 1,000 rows.
Responses
200 - Source-defined result; inspect its status and any per-row results.
JSON object with fields: status, lead_id.
Response Excerpt - Synthetic Values
{
"lead_id": "00000000-0000-4000-8000-000000000001"
}- Synthetic result excerpt; status labels and optional row fields depend on the actual result. An empty results array here illustrates the envelope, not the outcome of the example request.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}POST/api/v2/voice-campaigns/{campaignId}/leads/bulkBulk-upsert-campaign-leads
Bulk-upsert-campaign-leads
Process up to 1,000 lead objects. HTTP 200 can contain per-row failures; inspect every results entry.
- Required Scope
- leads:write
- Operation Type
- intake
- Changes records in the credential's account. Only send events and contact records you are authorized to submit.
Parameters
| Parameter | Type | Description and Limits | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
campaignIdpath / Required | uuid | Voice campaign in your account. | ||||||||||||||||||
bodybody / Required | array | JSON array of lead objects with a usable phone_number or phone.Maximum items: 1000 | ||||||||||||||||||
Fields in body
| ||||||||||||||||||||
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/voice-campaigns/00000000-0000-4000-8000-000000000001/leads/bulk' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '[{"phone_number":"+12025550123","first_name":"Example"}]'Request Body
application/json
Request Body - Synthetic Values
[
{
"phone_number": "+12025550123",
"first_name": "Example"
}
]- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- Maximum JSON body: 512 KiB, maximum structural nesting depth 64. A bulk request is a JSON array with at most 1,000 rows.
Responses
200 - Source-defined result; inspect its status and any per-row results.
JSON object with fields: results.
Response Excerpt - Synthetic Values
{
"results": []
}- Synthetic result excerpt; status labels and optional row fields depend on the actual result. An empty results array here illustrates the envelope, not the outcome of the example request.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}DELETE/api/v2/voice-campaigns/{campaignId}/leads/bulkBulk-remove-campaign-leads
Bulk-remove-campaign-leads
Remove up to 1,000 phone strings or objects with phone_number. Results report each row separately.
- Required Scope
- leads:write
- Operation Type
- intake
- Changes records in the credential's account. Only send events and contact records you are authorized to submit.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
campaignIdpath / Required | uuid | Voice campaign in your account. |
bodybody / Required | array | JSON array of phone strings or phone objects.Maximum items: 1000 |
Request Example - Replace Synthetic Values
curl --request DELETE 'https://app.closemagnet.com/api/v2/voice-campaigns/00000000-0000-4000-8000-000000000001/leads/bulk' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '["+12025550123"]'Request Body
application/json
Request Body - Synthetic Values
[
"+12025550123"
]- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- Maximum JSON body: 512 KiB, maximum structural nesting depth 64. A bulk request is a JSON array with at most 1,000 rows.
Responses
200 - Source-defined result; inspect its status and any per-row results.
JSON object with fields: results.
Response Excerpt - Synthetic Values
{
"results": []
}- Synthetic result excerpt; status labels and optional row fields depend on the actual result. An empty results array here illustrates the envelope, not the outcome of the example request.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}POST/api/intake/{campaignId}Lead-intake-alias
Lead-intake-alias
Compatibility alias. Add or update a lead by campaign and normalized phone. Repeating an intake can re-arm a lead; it is not a harmless status check.
- Required Scope
- leads:write
- Operation Type
- intake
- Changes records in the credential's account. Only send events and contact records you are authorized to submit.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
campaignIdpath / Required | uuid | Voice campaign in your account. |
phone_numberbody / Required | string | Phone number, normalized to E.164. At least 10 digits after normalization. |
first_namebody / Optional | string | First name. |
last_namebody / Optional | string | Last name. |
emailbody / Optional | string | Email address. |
custom_fieldsbody / Optional | object | Custom scalar values. Reserved identity/admin/role keys are removed. |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/intake/00000000-0000-4000-8000-000000000001' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"phone_number":"+12025550123","first_name":"Example","custom_fields":{}}'Request Body
application/json
Request Body - Synthetic Values
{
"phone_number": "+12025550123",
"first_name": "Example",
"custom_fields": {}
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- Maximum JSON body: 512 KiB, maximum structural nesting depth 64. A bulk request is a JSON array with at most 1,000 rows.
Responses
200 - Source-defined result; inspect its status and any per-row results.
JSON object with fields: status, lead_id.
Response Excerpt - Synthetic Values
{
"lead_id": "00000000-0000-4000-8000-000000000001"
}- Synthetic result excerpt; status labels and optional row fields depend on the actual result. An empty results array here illustrates the envelope, not the outcome of the example request.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}Call Intake
POST/api/v2/coaching/callsIngest-coaching-call
Ingest-coaching-call
Ingest a call transcript and stable provider event. Source plus external_call_id deduplicates it. Account-enabled automatic summarization can run after ingestion; this does not place a call. Requires the account API token in Authorization: Bearer. In the reviewed source, a scoped integration credential does not authorize this legacy intake; selecting buyers:write or coaching:write alone is not sufficient. This remains an authenticated account write, not a public endpoint.
- Required Scope
- See authentication and integration-specific notes.
- Operation Type
- intake
- Changes records in the credential's account. Only send events and contact records you are authorized to submit.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
transcriptbody / Required | string | Call transcript; nonempty after trimming.Minimum length: 1. Maximum length: 1000000 |
sourcebody / Required | string | Provider key; nonempty after trimming.Minimum length: 1. Maximum length: 64 |
external_call_idbody / Required | string | Stable provider call ID; nonempty after trimming.Minimum length: 1. Maximum length: 512 |
called_atbody / Required | datetime | Call timestamp. |
directionbody / Optional | enum | Required for phone/CRM sources; meeting providers may omit it.Allowed: inbound, outbound |
userbody / Optional | string | Rep name. |
contact_idbody / Optional | string | CRM contact ID. |
duration_secondsbody / Optional | number | Finite, nonnegative call duration in seconds. A valid fractional value is truncated toward zero.Minimum: 0. Maximum: 2147483647 |
recording_urlbody / Optional | string | Recording URL, when available. |
call_kindbody / Optional | enum | Defaults to human.Allowed: human, ai |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/coaching/calls' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"transcript":"Example call transcript for documentation.","source":"example-provider","external_call_id":"example-call-001","called_at":"2026-01-01T12:00:00Z","direction":"outbound"}'Request Body
application/json
Request Body - Synthetic Values
{
"transcript": "Example call transcript for documentation.",
"source": "example-provider",
"external_call_id": "example-call-001",
"called_at": "2026-01-01T12:00:00Z",
"direction": "outbound"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
- Requires the account API token in Authorization: Bearer. In the reviewed source, a scoped integration credential does not authorize this legacy intake; selecting buyers:write or coaching:write alone is not sufficient. This remains an authenticated account write, not a public endpoint.
- Maximum JSON request body: 4 MiB. Identity, time and direction requirements apply even when field aliases are used.
Responses
200 - Source-defined result; inspect its status and any per-row results.
JSON object with fields: status, human_call_id.
Response Excerpt - Synthetic Values
{
"human_call_id": "00000000-0000-4000-8000-000000000001"
}- Synthetic result excerpt; status labels and optional row fields depend on the actual result. An empty results array here illustrates the envelope, not the outcome of the example request.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}413 - Body exceeds 4 MiB.
JSON object with error, code and message.
Response Excerpt - Synthetic Values
{
"error": "bad_request",
"code": "body_too_large"
}415 - JSON content type and encoding are required.
JSON object with error, code and message.
Response Excerpt - Synthetic Values
{
"error": "bad_request"
}Delivery Callbacks
POST/api/v2/messages/eventsRecord-message-event
Record-message-event
Record an outcome for a message sent through your configured delivery webhook. This is not an agent tool. The message_id is CloseMagnet's delivery job, not your provider's message ID.
- Required Scope
- blasts:write
- Operation Type
- callback
- Changes records in the credential's account. Only send events and contact records you are authorized to submit.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
message_idbody / Required | uuid | CloseMagnet delivery job ID. |
eventbody / Required | enum | One outcome.Allowed: delivered, bounced, opened, clicked, replied, unsubscribed, complained |
atbody / Required | datetime | RFC 3339 timestamp with Z or numeric offset; no more than five minutes in the future. |
reply_textbody / Optional | string | Reply text when applicable.Maximum length: 4000 |
reasonbody / Optional | string | Failure or suppression reason.Maximum length: 500 |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/v2/messages/events' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"message_id":"00000000-0000-4000-8000-000000000001","event":"delivered","at":"2026-01-01T12:00:00Z"}'Request Body
application/json
Request Body - Synthetic Values
{
"message_id": "00000000-0000-4000-8000-000000000001",
"event": "delivered",
"at": "2026-01-01T12:00:00Z"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
Responses
200 - Source-defined result; inspect its status and any per-row results.
JSON object with fields: ok, duplicate.
Response Excerpt - Synthetic Values
{
"ok": true,
"duplicate": false
}- Synthetic result excerpt; status labels and optional row fields depend on the actual result. An empty results array here illustrates the envelope, not the outcome of the example request.
400 - A parameter or body value is invalid.
JSON object: error
Response Example - Synthetic Values
{
"error": "bad_request"
}401 - Missing, invalid, expired, revoked or insufficiently scoped credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "unauthorized"
}404 - No record visible to this credential.
JSON object: error
Response Example - Synthetic Values
{
"error": "not_found"
}429 - A request limit was exceeded.
JSON object: error
Response Example - Synthetic Values
{
"error": "rate_limited"
}502 - An upstream response could not be used.
JSON object: error
Response Example - Synthetic Values
{
"error": "upstream"
}503 - The service or a required dependency is unavailable.
JSON object: error
Response Example - Synthetic Values
{
"error": "unavailable"
}400 - A named event field failed validation.
JSON object: error, field.
Response Example - Synthetic Values
{
"error": "invalid_body",
"field": "message_id"
}POST/api/connector/doc-signedRecord-contract-signed
Record-contract-signed
Record a signed contract by document ID. A fresh assignment signature can add CRM notes, notify the team and file the signed contract. Acknowledgement does not mean an arbitrary document was found or signed.
- Required Scope
- documents:write
- Operation Type
- callback
- Changes records in the credential's account. Only send events and contact records you are authorized to submit.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
documentIdbody / Required | string | Signed CRM document ID. Also accepts document_id, id or document.id. |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/connector/doc-signed' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"documentId":"example-document-001"}'Request Body
application/json
Request Body - Synthetic Values
{
"documentId": "example-document-001"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
Responses
200 - Acknowledgement, including ignored, not-found and already-signed cases.
JSON object: ok, status.
Response Example - Synthetic Values
{
"ok": true,
"status": "not_found"
}- An acknowledgement is not a delivery receipt or proof that the supplied document matched a contract.
401 - Missing or invalid credential.
JSON object: ok, error
Response Example - Synthetic Values
{
"ok": false,
"error": "unauthorized"
}503 - The callback is unavailable.
JSON object: ok, error
Response Example - Synthetic Values
{
"ok": false,
"error": "unavailable"
}AI Agents
POST/api/mcpHosted MCP Connection
Hosted MCP Connection
Stateless Streamable HTTP MCP: one POST and JSON response, 95 catalogue tools. A well-formed credential can connect/list tools even if it is wrong; a real read tool checks credential validity and scopes. No OAuth or GET event stream.
- Required Scope
- See authentication and integration-specific notes.
- Operation Type
- read
- Tool listing changes no customer record. A tools/call has exactly the effect of the underlying API operation; write tools are not read-only.
Parameters
| Parameter | Type | Description and Limits |
|---|---|---|
jsonrpcbody / Required | enum | JSON-RPC version.Allowed: 2.0 |
idbody / Optional | integer | Request ID; notifications omit it. |
methodbody / Required | string | MCP method, such as initialize, tools/list, tools/call, resources/list or resources/read. |
paramsbody / Optional | object | The selected method's parameters. |
Request Example - Replace Synthetic Values
curl --request POST 'https://app.closemagnet.com/api/mcp' \
--header "Authorization: Bearer $CLOSEMAGNET_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Request Body
application/json
Request Body - Synthetic Values
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
Responses
200 - JSON-RPC result or error; tool refusals can be inside an HTTP 200 result.
JSON object with jsonrpc, id, and result or error. tools/list result has a tools array.
Response Excerpt - Synthetic Values
{
"jsonrpc": "2.0",
"id": 1
}- The result/error payload is omitted in this excerpt. Listing tools does not prove the key works.
401 - No credential arrived, or Authorization has the wrong form.
JSON object with error; WWW-Authenticate: Bearer realm=closemagnet.
Response Example - Synthetic Values
{
"error": "authentication_required"
}429 - Caller IP request limit exceeded; Retry-After is 60 seconds.
JSON object with error.
Response Example - Synthetic Values
{
"error": "rate_limited"
}Outbound Callbacks
Outbound Message Delivery Webhook
CloseMagnet hands one recipient/channel message to your sending infrastructure. Your service sends it and reports the outcome through Record Message Event.
- Destination
- POST Your configured public HTTPS delivery URL
- Authentication
- Your configured authentication headers. Enter actual values only in protected account settings.
- Content-Type
- application/json
- Idempotency-Key
- message- followed by the CloseMagnet delivery job ID
- X-CloseMagnet-Delivery-Id
- The same delivery job ID
Callback Example - Synthetic Values
{
"message_id": "00000000-0000-4000-8000-000000000001",
"blast_id": "00000000-0000-4000-8000-000000000001",
"property_id": "00000000-0000-4000-8000-000000000001",
"channel": "email",
"recipient": {
"buyer_id": "00000000-0000-4000-8000-000000000001",
"crm_contact_id": "example-contact-001",
"phone": "+12025550123",
"email": "buyer@example.com"
},
"subject": "Example deal",
"body": "Example message for a subscribed buyer.",
"send_after": null,
"source": "blast"
}- Synthetic example only. Replace example IDs with records in your own account. No request was sent.
200 - Any 2xx acknowledges acceptance; response body is ignored.
No response body required.
No complete response example is published for this response. Use the documented shape and notes.
- Acknowledge within 10 seconds and do your sending asynchronously. Redirects are not followed.
- Up to four attempts: retryable network failures, 408, 425, 429 and 5xx wait 30, 60 and 120 seconds; other 3xx/4xx are permanent failures.
- Deduplicate by message_id or Idempotency-Key. Acceptance by your endpoint is not delivery to the buyer.
- send_after is informational: scheduling has already been applied before dispatch. Configure receipts, replies, bounces, complaints and unsubscribe reporting separately.