Skip to Content
Documentation Sections

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

ParameterTypeDescription and Limits
campaign_idquery / OptionaluuidFilter by voice campaign UUID.
tabquery / OptionalstringDashboard lead tab filter.Maximum length: 32
statequery / OptionalstringLead state filter.Maximum length: 64
qquery / OptionalstringFree-text search.Maximum length: 200
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
lead_idpath / RequireduuidLead 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

ParameterTypeDescription and Limits
campaign_idquery / OptionaluuidFilter by voice campaign UUID.
startquery / OptionaldatetimeInclusive period start.
endquery / OptionaldatetimeExclusive period end.
timezonequery / OptionalstringIANA 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

ParameterTypeDescription and Limits
statusquery / OptionalenumFilter by approval status.Allowed: draft, approved, rejected, canceled, sent
lead_idquery / OptionaluuidFilter by lead UUID.
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
kindquery / OptionalenumRestrict the log to AI or human calls.Allowed: ai, human
campaign_idquery / OptionaluuidFilter by voice campaign UUID.
fromquery / OptionaldatetimeInclusive period start.
toquery / OptionaldatetimeExclusive period end.
qquery / OptionalstringFree-text search.Maximum length: 200
dispositionquery / OptionalstringDisposition filter.Maximum length: 120
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
call_kindpath / RequiredenumCall source family.Allowed: ai, human
call_idpath / RequireduuidCall 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

ParameterTypeDescription and Limits
campaign_idquery / OptionaluuidFilter by voice campaign UUID.
startquery / OptionaldatetimeInclusive period start.
endquery / OptionaldatetimeExclusive period end.
timezonequery / OptionalstringIANA 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

ParameterTypeDescription and Limits
startquery / OptionaldatetimeInclusive period start.
endquery / OptionaldatetimeExclusive 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

ParameterTypeDescription and Limits
fromquery / OptionaldayStart day in YYYY-MM-DD format.
toquery / OptionaldayEnd day in YYYY-MM-DD format.
marketquery / OptionalstringMarket 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

ParameterTypeDescription and Limits
qquery / OptionalstringFree-text search.Maximum length: 200
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
buyer_idpath / RequireduuidBuyer 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

ParameterTypeDescription and Limits
fromquery / OptionaldatetimeInclusive period start.
toquery / OptionaldatetimeExclusive 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

ParameterTypeDescription and Limits
filterquery / OptionalobjectDirectory filter object.
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
boundsquery / OptionalobjectMap bounds object.
filterquery / OptionalobjectDirectory 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

ParameterTypeDescription and Limits
property_idquery / RequireduuidProperty UUID to rank buyers against; must belong to the authenticated client.
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
qquery / OptionalstringFree-text search.Maximum length: 200
statusquery / OptionalstringProperty status filter.Maximum length: 64
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
property_idpath / RequireduuidProperty 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

ParameterTypeDescription and Limits
property_idquery / OptionaluuidOptional 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

ParameterTypeDescription and Limits
qquery / OptionalstringFree-text search.Maximum length: 200
statusquery / OptionalstringComp status filter.Maximum length: 64
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
comp_idpath / RequireduuidComp 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

ParameterTypeDescription and Limits
statusquery / OptionalstringCampaign status filter.Maximum length: 64
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
campaign_idpath / RequireduuidCampaign 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

ParameterTypeDescription and Limits
statusquery / OptionalstringBlast status filter.Maximum length: 64
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
blast_idpath / RequireduuidBlast 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

ParameterTypeDescription and Limits
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
statusquery / OptionalstringTransaction status filter.Maximum length: 64
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
transaction_idpath / RequireduuidTransaction 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

ParameterTypeDescription and Limits
transaction_idpath / RequireduuidTransaction UUID.
statusquery / OptionalstringTask status filter.Maximum length: 64
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
transaction_idpath / RequireduuidTransaction UUID.
rolequery / OptionalenumOnly parties with this role.Allowed: seller, buyer, title, escrow, lender, jv_partner, agent, other
limitquery / OptionalintegerPage size; defaults to 100.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
transaction_idpath / RequireduuidTransaction 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

ParameterTypeDescription and Limits
property_idquery / OptionaluuidFilter by property UUID.
statusquery / OptionalstringOffer status filter.Maximum length: 64
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
offer_idpath / RequireduuidOffer 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

ParameterTypeDescription and Limits
fromquery / OptionaldatetimeInclusive period start.
toquery / OptionaldatetimeExclusive period end.
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
property_idquery / OptionaluuidFilter by property UUID.
fromquery / OptionaldatetimeInclusive period start.
toquery / OptionaldatetimeExclusive period end.
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
flowquery / OptionalstringSubmission flow filter.Maximum length: 32
include_pending_reviewquery / OptionalenumInclude rows awaiting identity review; those rows carry no contact channel.Allowed: true, false
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
property_idquery / OptionaluuidFilter by property UUID.
kindquery / OptionalstringContract kind filter.Maximum length: 64
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
property_idquery / OptionaluuidFilter by property UUID.
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
statusquery / OptionalstringProject status filter.Maximum length: 64
property_idquery / OptionaluuidFilter by property UUID.
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
project_idpath / RequireduuidFlip 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

ParameterTypeDescription and Limits
project_idquery / OptionaluuidFilter by flip project UUID.
statusquery / OptionalstringTask status filter.Maximum length: 32
phasequery / OptionalstringProject phase filter.Maximum length: 32
include_archivedquery / OptionalenumInclude archived tasks; defaults to false.Allowed: true, false
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
project_idquery / OptionaluuidFilter by flip project UUID.
statusquery / OptionalstringScope item status filter.Maximum length: 32
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
project_idquery / OptionaluuidFilter by flip project UUID.
audiencequery / OptionalstringUpdate audience filter.Maximum length: 32
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
project_idquery / OptionaluuidFilter by flip project UUID.
sourcequery / OptionalstringNote source filter.Maximum length: 32
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
tradequery / OptionalstringVendor trade filter.Maximum length: 64
statusquery / OptionalstringVendor status filter.Maximum length: 32
active_onlyquery / OptionalenumRestrict to active vendors; defaults to false.Allowed: true, false
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
project_idquery / OptionaluuidFilter by flip project UUID.
statusquery / OptionalstringInspection run status filter.Maximum length: 32
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
project_idquery / OptionaluuidFilter by flip project UUID.
sectionquery / OptionalstringInspection section filter.Maximum length: 32
action_neededquery / OptionalenumNarrow to findings that do or do not need action; omit for no filter.Allowed: true, false
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
profile_idquery / OptionaluuidNarrow to one team member profile UUID; omit for the whole client.
monthquery / OptionaldayAny day in the statement month, in YYYY-MM-DD format.
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
monthquery / OptionaldayAny day in the payout month, in YYYY-MM-DD format.
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
profile_idquery / OptionaluuidFilter by team member profile UUID.
transaction_idquery / OptionaluuidFilter by transaction UUID.
statusquery / OptionalstringLedger entry status filter.Maximum length: 32
entry_kindquery / OptionalstringLedger entry kind filter.Maximum length: 32
monthquery / OptionaldayAny day in the period month, in YYYY-MM-DD format.
include_supersededquery / OptionalenumInclude superseded entry versions; defaults to false.Allowed: true, false
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
entry_idquery / OptionaluuidFilter by ledger entry UUID.
event_typequery / OptionalstringLedger event type filter.Maximum length: 32
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
applies_toquery / OptionalstringPlan applicability filter.Maximum length: 32
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
codequery / OptionalstringCommission plan code filter.Maximum length: 64
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
profile_idquery / OptionaluuidFilter by team member profile UUID.
statusquery / OptionalstringSettlement status filter.Maximum length: 32
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
profile_idquery / OptionaluuidFilter by team member profile UUID.
statusquery / OptionalstringEmployment status filter.Maximum length: 32
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
startquery / RequireddatetimeInclusive period start; required because the series is zero-filled.
endquery / RequireddatetimeExclusive period end; the window may not exceed 366 days.
tzquery / OptionalstringIANA 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

ParameterTypeDescription and Limits
startquery / OptionaldatetimeInclusive period start.
endquery / OptionaldatetimeExclusive period end.
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
searchquery / OptionalstringFree-text search.Maximum length: 200
startquery / OptionaldatetimeInclusive period start.
endquery / OptionaldatetimeExclusive period end.
sort_keyquery / OptionalstringSort column; the wrapper is the enumeration authority.Maximum length: 32
sort_directionquery / OptionalstringSort direction; the wrapper is the enumeration authority.Maximum length: 8
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
searchquery / OptionalstringFree-text search.Maximum length: 200
kindquery / OptionalstringCall source family filter; the wrapper is the enumeration authority.Maximum length: 16
directionquery / OptionalstringCall direction filter; the wrapper is the enumeration authority.Maximum length: 16
dispositionquery / OptionalstringDisposition filter.Maximum length: 120
startquery / OptionaldatetimeInclusive period start.
endquery / OptionaldatetimeExclusive period end.
sort_keyquery / OptionalstringSort column; the wrapper is the enumeration authority.Maximum length: 32
sort_directionquery / OptionalstringSort direction; the wrapper is the enumeration authority.Maximum length: 8
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
report_typequery / OptionalstringReport type filter.Maximum length: 64
subject_keyquery / OptionalstringReport subject key filter.Maximum length: 200
generated_at_fromquery / OptionaldatetimeInclusive generated-at lower bound.
generated_at_beforequery / OptionaldatetimeExclusive generated-at upper bound.
sort_directionquery / OptionalstringSort direction; the wrapper is the enumeration authority.Maximum length: 8
limitquery / OptionalintegerKeyset page size; defaults to 25.Minimum: 1. Maximum: 100
cursor_generated_atquery / OptionaldatetimeKeyset cursor timestamp; must be supplied with cursor_report_id.
cursor_report_idquery / OptionaluuidKeyset cursor report UUID; must be supplied with cursor_generated_at.
snapshot_generated_atquery / OptionaldatetimeWalk fence timestamp; must be supplied with snapshot_report_id.
snapshot_report_idquery / OptionaluuidWalk 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

ParameterTypeDescription and Limits
report_idquery / RequireduuidSaved coaching report UUID.
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
enabledquery / OptionalenumNarrow to enabled or disabled surfaces; omit for no filter.Allowed: true, false
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
enabledquery / OptionalenumNarrow to enabled or disabled pack assignments; omit for no filter.Allowed: true, false
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
profile_idquery / OptionaluuidFilter by team member profile UUID.
workspace_idquery / OptionaluuidNarrow to one workspace UUID inside the client's own set.
member_rolequery / OptionalenumAccess tier filter.Allowed: owner, operational
searchquery / OptionalstringFree-text search.Maximum length: 200
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
profile_idpath / RequireduuidTeam 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

ParameterTypeDescription and Limits
member_rolequery / OptionalenumInvited access tier filter.Allowed: owner, operational
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
profile_idquery / OptionaluuidFilter by team member profile UUID.
surface_keyquery / OptionalstringSurface key filter matched by equality.Maximum length: 64
enabledquery / OptionalenumNarrow to enabled or disabled overrides; omit for no filter.Allowed: true, false
limitquery / OptionalintegerPage size; defaults to 50.Minimum: 1. Maximum: 200
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
channelbody / RequiredenumDelivery channel for the drafted message.Allowed: sms, email
to_refbody / RequiredstringDestination the message is drafted for: an email address or an E.164 phone number.Maximum length: 320
bodybody / RequiredstringMessage body, at most 4000 characters.Maximum length: 4000
lead_idbody / OptionaluuidLead UUID this draft is for; must belong to the authenticated client.
subjectbody / OptionalstringSubject 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

ParameterTypeDescription and Limits
buyer_idsbody / Requireduuid_arrayAudience as platform buyer UUIDs; any id outside the authenticated client is dropped.Minimum items: 1. Maximum items: 5000
audience_kindbody / OptionalenumHow the audience was chosen; defaults to match.Allowed: match, manual
namebody / OptionalstringLabel for the drafted blast.Maximum length: 200
property_idbody / OptionaluuidProperty UUID this blast is for; must belong to the authenticated client.
channelsbody / Optionalenum_arrayChannels to queue; defaults to both.Allowed: sms, email. Minimum items: 1. Maximum items: 2
subjectbody / OptionalstringEmail subject snapshot.Maximum length: 200
body_emailbody / OptionalstringEmail template snapshot.Maximum length: 20000
body_smsbody / OptionalstringSMS 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

ParameterTypeDescription and Limits
property_idbody / RequireduuidProperty UUID the offer is on; must belong to the authenticated client.
buyer_idbody / OptionaluuidBuyer UUID making the offer; must belong to the authenticated client. Required when creating, ignored when amending.
offer_idbody / OptionaluuidExisting offer UUID to amend; it must belong to the authenticated client and to property_id. Omit to create a new offer.
amountbody / OptionalnumberOffer 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 / OptionaldayRequested close date, as YYYY-MM-DD.
inspection_end_datebody / OptionaldayInspection period end date, as YYYY-MM-DD.
emd_amountbody / OptionalnumberEarnest money deposit in dollars, never negative. It must meet the property minimum EMD or the request is refused.Minimum: 0
emd_due_atbody / OptionaldayDate the earnest money deposit is due, as YYYY-MM-DD.
funding_typebody / OptionalenumHow 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 / OptionalstringDescription of the funding, required when funding_type is other and rejected otherwise.Maximum length: 200
notesbody / OptionalstringFree-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

ParameterTypeDescription and Limits
transaction_idpath / RequireduuidTransaction UUID the task belongs to; must belong to the authenticated client.
task_idpath / RequireduuidChecklist task UUID to complete; must belong to the named transaction.
notesbody / OptionalstringNote 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

ParameterTypeDescription and Limits
transaction_idpath / RequireduuidTransaction UUID to append to; must belong to the authenticated client.
bodybody / RequiredstringNote text; markup and control characters are stripped in the database.Maximum length: 100000
partybody / OptionalstringWho 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

ParameterTypeDescription and Limits
flip_idpath / RequireduuidFlip project UUID; must belong to the authenticated client.
task_idpath / RequireduuidSchedule task UUID belonging to that flip project.
notesbody / OptionalstringCompletion 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

ParameterTypeDescription and Limits
flip_idpath / RequireduuidFlip project UUID; must belong to the authenticated client.
bodybody / RequiredstringNote 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

ParameterTypeDescription and Limits
property_idbody / RequireduuidProperty UUID to run comps on; must belong to the authenticated client.
confirm_spendbody / RequiredbooleanMust be exactly true. A comp run is billed, so an unconfirmed request is refused with confirm_spend_required before anything else happens.
contact_namebody / OptionalstringSeller contact name to pass to the comp engine.Maximum length: 200
contact_phonebody / OptionalstringSeller contact phone to pass to the comp engine.Maximum length: 50
repair_estimatebody / OptionalstringEstimated repair cost as a non-negative amount up to 99999999; defaults to the property's own repair estimate.Maximum length: 32
ghl_contact_idbody / OptionalstringCRM contact id to attach the run to; defaults to the property's seller contact.Maximum length: 200
idempotency_keybody / OptionalstringYour 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

ParameterTypeDescription and Limits
property_idbody / OptionaluuidUpdate this property. A property is never created when property_id is given; one that is not in this account is not found.
external_refbody / OptionalstringYour own reference for the property, unique in the account: 1 to 128 characters of letters, digits and . _ : / - .Maximum length: 128
addressbody / OptionalstringStreet address, 1 to 300 characters. Required to create a property; cannot be blanked.Maximum length: 300
streetbody / OptionalstringStreet line.Maximum length: 200
citybody / OptionalstringCity.Maximum length: 100
statebody / OptionalstringState.Maximum length: 50
zipbody / OptionalstringPostal code.Maximum length: 20
apnbody / OptionalstringAssessor parcel number.Maximum length: 100
seller_crm_contact_idbody / OptionalstringThe 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 / OptionalstringExit type, free text (Assignment, Double Close, Novation, Wholetail, Fix & Flip, Buy & Hold are the app's suggestions).Maximum length: 100
source_typebody / OptionalenumDeal source. On create it is inferred as jv_deal when JV fields are sent.Allowed: own_contract, jv_deal
jv_contact_idbody / OptionalstringThe JV partner's contact id in your CRM: 1 to 128 letters, digits, hyphens or underscores.Maximum length: 128
jv_split_pctbody / OptionalnumberJV split percent, 0 to 100.Minimum: 0. Maximum: 100
contract_pricebody / OptionalnumberContract price (what you pay the seller). Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99
asking_pricebody / OptionalnumberAsking price. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99
arvbody / OptionalnumberAfter-repair value. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99
repair_estimatebody / OptionalnumberRepair estimate. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99
assignment_fee_targetbody / OptionalnumberTarget 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 / OptionalnumberSeller-side purchase EMD amount. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99
mls_list_pricebody / OptionalnumberMLS list price. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99
purchase_closing_datebody / OptionaldayPurchase 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 / OptionaldaySeller-side inspection end date. Moves task due dates, as in the app.
mls_list_datebody / OptionaldayMLS list date.
contract_datebody / OptionaldayContract date.
close_datebody / OptionaldayClose date. Keeps the active workfile's first closing date in step, as in the app.
listed_on_mlsbody / OptionalbooleanWhether the property is listed on the MLS.
mls_numberbody / OptionalstringMLS number.Maximum length: 100
bedsbody / OptionalnumberBedrooms, 0 to 100.Minimum: 0. Maximum: 100
bathsbody / OptionalnumberBathrooms, 0 to 100.Minimum: 0. Maximum: 100
sqftbody / OptionalintegerSquare feet, 0 to 1000000.Minimum: 0. Maximum: 1000000
year_builtbody / OptionalintegerYear built, 1600 to 2100.Minimum: 1600. Maximum: 2100
title_companybody / OptionalstringThe property's title company (the workfile has its own, set with update_transaction).Maximum length: 200
notes_appendbody / OptionalstringText 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 / OptionalbooleanCreate 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 / OptionaldatetimeOptional 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 / Optionalenum_arrayNames 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 / Optionalbooleantrue 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 / OptionalstringRequired 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

ParameterTypeDescription and Limits
property_idpath / RequireduuidProperty UUID; must belong to the authenticated client.
external_refbody / OptionalstringYour own reference for the property, unique in the account: 1 to 128 characters of letters, digits and . _ : / - .Maximum length: 128
addressbody / OptionalstringStreet address, 1 to 300 characters. Required to create a property; cannot be blanked.Maximum length: 300
streetbody / OptionalstringStreet line.Maximum length: 200
citybody / OptionalstringCity.Maximum length: 100
statebody / OptionalstringState.Maximum length: 50
zipbody / OptionalstringPostal code.Maximum length: 20
apnbody / OptionalstringAssessor parcel number.Maximum length: 100
seller_crm_contact_idbody / OptionalstringThe 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 / OptionalstringExit type, free text (Assignment, Double Close, Novation, Wholetail, Fix & Flip, Buy & Hold are the app's suggestions).Maximum length: 100
source_typebody / OptionalenumDeal source. On create it is inferred as jv_deal when JV fields are sent.Allowed: own_contract, jv_deal
jv_contact_idbody / OptionalstringThe JV partner's contact id in your CRM: 1 to 128 letters, digits, hyphens or underscores.Maximum length: 128
jv_split_pctbody / OptionalnumberJV split percent, 0 to 100.Minimum: 0. Maximum: 100
contract_pricebody / OptionalnumberContract price (what you pay the seller). Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99
asking_pricebody / OptionalnumberAsking price. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99
arvbody / OptionalnumberAfter-repair value. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99
repair_estimatebody / OptionalnumberRepair estimate. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99
assignment_fee_targetbody / OptionalnumberTarget 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 / OptionalnumberSeller-side purchase EMD amount. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99
mls_list_pricebody / OptionalnumberMLS list price. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99
purchase_closing_datebody / OptionaldayPurchase 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 / OptionaldaySeller-side inspection end date. Moves task due dates, as in the app.
mls_list_datebody / OptionaldayMLS list date.
contract_datebody / OptionaldayContract date.
close_datebody / OptionaldayClose date. Keeps the active workfile's first closing date in step, as in the app.
listed_on_mlsbody / OptionalbooleanWhether the property is listed on the MLS.
mls_numberbody / OptionalstringMLS number.Maximum length: 100
bedsbody / OptionalnumberBedrooms, 0 to 100.Minimum: 0. Maximum: 100
bathsbody / OptionalnumberBathrooms, 0 to 100.Minimum: 0. Maximum: 100
sqftbody / OptionalintegerSquare feet, 0 to 1000000.Minimum: 0. Maximum: 1000000
year_builtbody / OptionalintegerYear built, 1600 to 2100.Minimum: 1600. Maximum: 2100
title_companybody / OptionalstringThe property's title company (the workfile has its own, set with update_transaction).Maximum length: 200
notes_appendbody / OptionalstringText 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 / OptionaldatetimeOptional 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 / Optionalenum_arrayNames 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 / Optionalbooleantrue 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 / OptionalstringRequired 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

ParameterTypeDescription and Limits
property_idpath / RequireduuidProperty UUID; must belong to the authenticated client.
stagebody / RequiredenumThe 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 / OptionalenumOptional 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 / OptionaldatetimeOptional 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 / OptionalstringThe full explanation, 1 to 10000 characters. Required for fell_through; optional for other stages.Maximum length: 10000
fall_through_categorybody / OptionalenumRequired 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 / OptionalenumWho 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 / OptionaluuidRequired exactly when fall_through_attribution is buyer; that buyer must have an offer on this deal.
buyer_idbody / OptionaluuidBuyer 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 / OptionalnumberActual 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 / OptionalstringOne 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 / Optionalbooleantrue 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 / OptionalstringRequired 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

ParameterTypeDescription and Limits
property_idpath / RequireduuidProperty UUID; must belong to the authenticated client.
rolebody / RequiredenumThe deal role to set or clear.Allowed: acq, dispo, followup, tc
profile_idbody / OptionaluuidThe person's profile id. Send exactly one of profile_id, email or clear_role.
emailbody / OptionalstringThe person's email, matched ignoring case and outer spaces. Send exactly one of profile_id, email or clear_role.Maximum length: 254
clear_rolebody / Optionalbooleantrue removes the owner from the role. Send exactly one of profile_id, email or clear_role.
reasonbody / OptionalstringOptional reason, up to 500 characters; stored in the role history.Maximum length: 500
dry_runbody / Optionalbooleantrue 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 / OptionalstringYour 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

ParameterTypeDescription and Limits
transaction_idpath / RequireduuidTransaction UUID the task belongs to; must belong to the authenticated client.
task_idpath / RequireduuidChecklist task UUID to reopen; must belong to the named transaction.
notesbody / OptionalstringNote to store on the task, at most 4000 characters; omitting it leaves the existing note untouched.Maximum length: 4000
dry_runbody / Optionalbooleantrue 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 / OptionalstringYour 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

ParameterTypeDescription and Limits
transaction_idpath / RequireduuidTransaction UUID the task belongs to; must belong to the authenticated client.
task_idpath / RequireduuidChecklist task UUID; must belong to the named transaction.
not_applicablebody / Requiredbooleantrue marks the task not applicable; false undoes the mark.
notesbody / OptionalstringNote to store on the task, at most 4000 characters; omitting it leaves the existing note untouched.Maximum length: 4000
dry_runbody / Optionalbooleantrue 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 / OptionalstringYour 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

ParameterTypeDescription and Limits
transaction_idpath / RequireduuidTransaction UUID the task belongs to; must belong to the authenticated client.
task_idpath / RequireduuidChecklist task UUID; must belong to the named transaction.
assignee_profile_idbody / OptionaluuidA member's profile id. Send exactly one of assignee_profile_id, assignee_email, assignee_option or unassign.
assignee_emailbody / OptionalstringA 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 / OptionalstringAn option value from list_transaction_task_assignees. Send exactly one of assignee_profile_id, assignee_email, assignee_option or unassign.Maximum length: 300
unassignbody / Optionalbooleantrue removes the assignee. Send exactly one of assignee_profile_id, assignee_email, assignee_option or unassign.
dry_runbody / Optionalbooleantrue 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 / OptionalstringYour 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

ParameterTypeDescription and Limits
transaction_idpath / RequireduuidTransaction UUID; must belong to the authenticated client.
exit_strategybody / OptionalenumExit strategy. Locked after a closing event.Allowed: wholesale_assignment, double_close, flip, listing, off_market
ratification_datebody / OptionaldayRatification date. Moves date-anchored task due dates.
first_scheduled_closing_datebody / OptionaldayFirst scheduled closing date. Also sets the property's close and purchase-closing dates.
second_scheduled_closing_datebody / OptionaldaySecond scheduled closing date (second leg of a double close or flip).
seller_emd_amountbody / OptionalnumberSeller EMD amount. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99
buyer_emd_amountbody / OptionalnumberBuyer EMD amount. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99
seller_emd_holderbody / OptionalstringSeller EMD holder.Maximum length: 200
buyer_emd_holderbody / OptionalstringBuyer EMD holder.Maximum length: 200
seller_emd_deadlinebody / OptionaldaySeller EMD deadline.
buyer_emd_deadlinebody / OptionaldayBuyer EMD deadline.
seller_emd_received_atbody / OptionaldatetimeWhen the workfile recorded the seller EMD as received.
buyer_emd_received_atbody / OptionaldatetimeWhen 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 / OptionalstringWorkfile title company.Maximum length: 200
title_officerbody / OptionalstringTitle officer.Maximum length: 200
title_phonebody / OptionalstringTitle phone.Maximum length: 50
title_emailbody / OptionalstringTitle email address.Maximum length: 254
title_file_numberbody / OptionalstringTitle file number.Maximum length: 100
title_order_datebody / OptionaldayTitle order date.
title_commitment_datebody / OptionaldayTitle commitment date.
clear_to_close_atbody / OptionaldatetimeWhen clear to close was reached.
section19_notesbody / OptionalstringSection 19 notes.Maximum length: 10000
audit_flagsbody / OptionalobjectBooleans 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 / OptionalnumberActual gross assignment fee. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99
actual_deal_profitbody / OptionalnumberActual deal profit. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99
gross_listing_commissionbody / OptionalnumberGross listing commission. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99
deal_expensesbody / OptionalnumberDeal expenses. Up to 2 decimals, 0 to 999999999.99.Minimum: 0. Maximum: 999999999.99
expected_updated_atbody / OptionaldatetimeOptional 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 / Optionalenum_arrayNames 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 / Optionalbooleantrue 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 / OptionalstringYour 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

ParameterTypeDescription and Limits
transaction_idpath / RequireduuidTransaction UUID; must belong to the authenticated client.
party_idbody / OptionaluuidUpdate this party; one that is not on this workfile is not found.
rolebody / OptionalenumThe 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 / OptionalstringParty name.Maximum length: 200
phonebody / OptionalstringParty phone.Maximum length: 50
emailbody / OptionalstringParty email address.Maximum length: 254
crm_contact_idbody / OptionalstringThe 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 / OptionaluuidA buyer in this account to link to the party.
clearbody / Optionalenum_arrayNames 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 / Optionalbooleantrue 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 / OptionalstringRequired 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

ParameterTypeDescription and Limits
ghl_contact_idbody / RequiredstringYour 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 / OptionalstringBuyer's name.
emailbody / OptionalstringEmail address.
phonebody / OptionalstringPhone number.
custom_fieldsbody / OptionalobjectCanonical 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

ParameterTypeDescription and Limits
addressbody / RequiredstringProperty address; required for creation.
citybody / OptionalstringCity.
statebody / OptionalstringState.
zipbody / OptionalstringZIP/postal code.
seller_ghl_contact_idbody / OptionalstringCRM 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

ParameterTypeDescription and Limits
addressbody / RequiredstringProperty address; required for creation.
citybody / OptionalstringCity.
statebody / OptionalstringState.
zipbody / OptionalstringZIP/postal code.
seller_ghl_contact_idbody / OptionalstringCRM 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

ParameterTypeDescription and Limits
contact_idbody / RequiredstringGoHighLevel contact ID, mapped to the stable intake contact ID.
full_namebody / OptionalstringBuyer name.
emailbody / OptionalstringBuyer email.
phonebody / OptionalstringBuyer 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

ParameterTypeDescription and Limits
address1body / RequiredstringProperty address; full_address is an accepted fallback.
full_addressbody / OptionalstringFallback when address1 is absent.
postal_codebody / OptionalstringZIP/postal code.
contact_idbody / OptionalstringSeller 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

ParameterTypeDescription and Limits
x-kpi-typeheader / RequiredenumKPI event type.Allowed: new_seller_lead, pass_off, process_call, dial, call_connected, call_disposition, touch, quality_touch
contact_idbody / OptionalstringStable CRM contact ID used for deduplication.
eventIdbody / OptionalstringStable external event identifier, when known.
messageIdbody / OptionalstringCRM message identifier, when known.
callIdbody / OptionalstringStable call identifier, when known.
dispositionbody / OptionalstringRep-confirmed outcome for a call disposition.
occurred_atbody / OptionaldatetimeEvent 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

ParameterTypeDescription and Limits
x-kpi-typeheader / RequiredenumKPI event type.Allowed: new_seller_lead, pass_off, process_call, dial, call_connected, call_disposition, touch, quality_touch
contact_idbody / OptionalstringStable CRM contact ID used for deduplication.
eventIdbody / OptionalstringStable external event identifier, when known.
messageIdbody / OptionalstringCRM message identifier, when known.
callIdbody / OptionalstringStable call identifier, when known.
dispositionbody / OptionalstringRep-confirmed outcome for a call disposition.
occurred_atbody / OptionaldatetimeEvent 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

ParameterTypeDescription and Limits
campaignIdpath / RequireduuidVoice campaign in your account.
limitquery / OptionalintegerPage size, default 100; values are clamped server-side.Minimum: 1. Maximum: 500
offsetquery / OptionalintegerZero-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

ParameterTypeDescription and Limits
campaignIdpath / RequireduuidVoice campaign in your account.
phone_numberbody / RequiredstringPhone number, normalized to E.164. At least 10 digits after normalization.
first_namebody / OptionalstringFirst name.
last_namebody / OptionalstringLast name.
emailbody / OptionalstringEmail address.
custom_fieldsbody / OptionalobjectCustom 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

ParameterTypeDescription and Limits
campaignIdpath / RequireduuidVoice campaign in your account.
phone_numberbody / RequiredstringPhone 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

ParameterTypeDescription and Limits
campaignIdpath / RequireduuidVoice campaign in your account.
bodybody / RequiredarrayJSON array of lead objects with a usable phone_number or phone.Maximum items: 1000

Fields in body

ParameterTypeDescription and Limits
body.phone_numberbody / RequiredstringPhone number, normalized to E.164. At least 10 digits after normalization.
body.first_namebody / OptionalstringFirst name.
body.last_namebody / OptionalstringLast name.
body.emailbody / OptionalstringEmail address.
body.custom_fieldsbody / OptionalobjectCustom 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/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

ParameterTypeDescription and Limits
campaignIdpath / RequireduuidVoice campaign in your account.
bodybody / RequiredarrayJSON 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

ParameterTypeDescription and Limits
campaignIdpath / RequireduuidVoice campaign in your account.
phone_numberbody / RequiredstringPhone number, normalized to E.164. At least 10 digits after normalization.
first_namebody / OptionalstringFirst name.
last_namebody / OptionalstringLast name.
emailbody / OptionalstringEmail address.
custom_fieldsbody / OptionalobjectCustom 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

ParameterTypeDescription and Limits
transcriptbody / RequiredstringCall transcript; nonempty after trimming.Minimum length: 1. Maximum length: 1000000
sourcebody / RequiredstringProvider key; nonempty after trimming.Minimum length: 1. Maximum length: 64
external_call_idbody / RequiredstringStable provider call ID; nonempty after trimming.Minimum length: 1. Maximum length: 512
called_atbody / RequireddatetimeCall timestamp.
directionbody / OptionalenumRequired for phone/CRM sources; meeting providers may omit it.Allowed: inbound, outbound
userbody / OptionalstringRep name.
contact_idbody / OptionalstringCRM contact ID.
duration_secondsbody / OptionalnumberFinite, nonnegative call duration in seconds. A valid fractional value is truncated toward zero.Minimum: 0. Maximum: 2147483647
recording_urlbody / OptionalstringRecording URL, when available.
call_kindbody / OptionalenumDefaults 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

ParameterTypeDescription and Limits
message_idbody / RequireduuidCloseMagnet delivery job ID.
eventbody / RequiredenumOne outcome.Allowed: delivered, bounced, opened, clicked, replied, unsubscribed, complained
atbody / RequireddatetimeRFC 3339 timestamp with Z or numeric offset; no more than five minutes in the future.
reply_textbody / OptionalstringReply text when applicable.Maximum length: 4000
reasonbody / OptionalstringFailure 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

ParameterTypeDescription and Limits
documentIdbody / RequiredstringSigned 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

ParameterTypeDescription and Limits
jsonrpcbody / RequiredenumJSON-RPC version.Allowed: 2.0
idbody / OptionalintegerRequest ID; notifications omit it.
methodbody / RequiredstringMCP method, such as initialize, tools/list, tools/call, resources/list or resources/read.
paramsbody / OptionalobjectThe 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.