Open To Close TC Platform Hub
Open To Close (OTC) is the Transaction Coordinator (TC) platform for RERI’s real estate deal management. This hub covers the OTC REST API, authentication pattern, property/transaction lifecycle, contact management, and HubSpot deal-ID association. Read before writing any TC automation, document upload, or deal status sync. Every OTC API call references a HubSpot deal-id — the two systems are tightly coupled; OTC is the TC operational layer, HubSpot is the CRM source of truth.
Quick reference
| Field | Value |
|---|---|
| Vendor | Open To Close |
| URL | https://app.opentoclose.com / https://api.opentoclose.com/v1 |
| KB doc | API |
| Auth method | API key via query string (?api_token=TOKEN) |
| Auth credential | op://Aurora/opentoclose/api-token |
| Cred-proxy port | n/a (until B1-B6 ratified per nemoclaw-audit-2026-05-03) |
| Webhook port | n/a (webhooks not documented in API; use Zapier integration for event triggers) |
| Webhook handler | n/a |
| Webhook dedup table | n/a |
| Tunnel path | n/a |
| Outbound API base | https://api.opentoclose.com/v1 |
| Rate limits | 1 request per second (429 on exceed) |
| Rate-limit action | 429 → 1s sleep + retry (3 retries), Discord ops alert |
| Pagination | offset (default 0) + limit (default 20, max 100); Properties max 50/call |
| Total endpoints | 37 across 18 resource groups |
| Cost | Subscription (SaaS); no per-call API cost |
| Backup/recovery | OTC-owned SaaS; Supabase sync for deal state mirror |
| Discord alert channel | ops |
| Drift cadence | on-API-change; manual |
| Data license | subscription — active OTC account required |
| Status | production |
⚠️ Auth: query string token, NOT Bearer header
OTC uses ?api_token=TOKEN in the query string — NOT an Authorization: Bearer header. This is a common foot-gun. The previous (fabricated) KB docs had this wrong. Always append ?api_token=<TOKEN> to every request URL.
# Correct
curl "https://api.opentoclose.com/v1/properties?api_token=YOUR_TOKEN&limit=10"
# Wrong (will 403)
curl "https://api.opentoclose.com/v1/properties" -H "Authorization: Bearer YOUR_TOKEN"Token is retrieved from: op://Aurora/opentoclose/api-token
⚠️ HubSpot deal-id association: mandatory
Every OTC property (deal/transaction) must be associated with a HubSpot deal-id. The api_data field on OTC Properties carries external IDs (Follow Up Boss, Dotloop, Brokermint, SkySlope). When creating or updating an OTC property:
- Retrieve the HubSpot deal-id from hubspot (acq pipeline 877963314 or dispo 816046)
- Store the OTC property
idback on the HubSpot deal in a custom property (e.g.,otc_property_id) - All downstream OTC calls use the OTC property
id; all CRM queries use the HubSpot deal-id - Without this association, TC workflow events cannot be linked back to the deal pipeline
Data model: Properties are key-value based
OTC “Properties” are the core transaction/deal objects (NOT real estate properties). They use a dynamic field_values array — not fixed columns:
{
"id": 1,
"field_values": [
{"key": "contract_title", "value": "123 Main St, Riverside CA 92501", "type": "text"},
{"key": "contract_status", "value": "Pending", "type": "choice"},
{"key": "property_address", "value": "123 Main St"},
{"key": "property_city", "value": "Riverside"},
{"key": "property_state", "value": "CA"},
{"key": "property_zip", "value": "92501"}
]
}When updating: use PATCH /v1/properties/:id with {"field_identifier": "key", "fields": [{"key": "...", "value": "..."}]}
Components
workspace/knowledge-base/opentoclose/API.md— Full REST API reference (37 endpoints, verified 2026-03-17 live scrape)workspace/knowledge-base/opentoclose/raw-collection.json— Raw Postman collection (260KB)workspace/knowledge-base/opentoclose/endpoints-parsed.json— Machine-parseable endpoint list (91KB)https://app.opentoclose.com— TC platform UIhttps://api.opentoclose.com/v1— REST API base
Key endpoints
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/properties | List all deals (max 50/call) |
| GET | /v1/properties/:id | Get single deal |
| POST | /v1/properties/ | Create new deal (requires team_member_id, agent_id, time_zone_id, property_template_id) |
| PATCH | /v1/properties/:id | Update deal field values |
| GET | /v1/properties/:id/contacts | Get contacts on deal |
| POST | /v1/properties/:id/contacts | Associate contact + role to deal |
| POST | /v1/properties/:id/documents | Upload document (base64-encoded; types: pdf, doc, docx, jpg, png, xls, csv, xlsx, zip) |
| GET | /v1/properties/:id/notes | List deal notes |
| POST | /v1/properties/:id/notes | Create note (pinned, private, priority) |
| GET | /v1/propertyFields | List all dynamic field definitions |
| GET | /v1/teams/ | List teams + members (needed for property creation) |
| GET | /v1/propertyTemplates/ | List templates (needed for property creation) |
| GET | /v1/timeZones | List time zones (needed for property creation) |
How it’s used
- TC workflow creation: When a deal passes acq gate, create OTC property using HubSpot deal-id reference; assign to TC team member
- Document management: Upload signed contracts, disclosures, and TC deliverables via
POST /v1/properties/:id/documents(base64-encoded) - Deal status sync: PATCH
contract_statusfield as deal moves through TC stages; mirror to HubSpot deal stage via betterfiles-dispo-emails - Contact association: Attach buyer, seller, title, escrow contacts per deal using
POST /v1/properties/:id/contactswith appropriatecontact_role_id - Failure mode: 403 = wrong auth method (use query string, not header); 429 = rate limit (1 req/sec — add 1s delay in loops); 409 conflict on duplicate contact
- Success criteria: OTC property created and linked to HubSpot deal within 5 min of deal approval; TC notes and docs visible in OTC UI
Pagination pattern
// OTC pagination: offset + limit (not page-based)
async function getAllOtcProperties(apiToken) {
let offset = 0;
const limit = 50; // max for properties
const all = [];
while (true) {
const res = await fetch(
`https://api.opentoclose.com/v1/properties?api_token=${apiToken}&offset=${offset}&limit=${limit}`
);
const batch = await res.json();
all.push(...batch);
if (batch.length < limit) break;
offset += limit;
await new Promise(r => setTimeout(r, 1100)); // rate limit: 1 req/sec
}
return all;
}Cross-links
Agents that touch this
- _summary — deal coordination, TC handoff
- _summary — triggers OTC property creation on deal approval
- _summary — updates OTC deal status on buyer selection
Skills that invoke this
- betterfiles-dispo-emails — TC email workflows referencing OTC deal state
- betterfiles-cda — generates CDA PDF and uploads to OTC documents
- hubspot-deal-ingest — creates HubSpot deal; OTC property creation follows as downstream step
Plans that govern this
- openclaw-self-improvement-layer-2026-05-03 — TC automation improvements in OSIL roadmap
- openclaw-fragmentation-fix-2026-05-01 — G-NO-PLAINTEXT-CREDS: OTC token must use
op://reference
Feedback rules
- feedback_no_plaintext_creds — OTC api-token via
op://Aurora/opentoclose/api-tokenonly - feedback_verify_schema_before_designing — OTC uses dynamic field_values; always GET
/v1/propertyFieldsbefore assuming field keys - feedback_no_assumptions — previous OTC KB was entirely fabricated; use verified KB (2026-03-17) only
KB / source docs
- API — verified REST API reference (live scrape 2026-03-17); endpoints-parsed.json for machine-readable schema
System maps
- request-lifecycle — TC handoff position in the deal lifecycle
- deal-lifecycle-map — full deal flow including OTC TC phase
Related: Real estate data platform cluster
| Platform | Hub | Role |
|---|---|---|
| CRMLS | crmls | MLS listing source |
| PropStream | propstream | Flipper lead lists |
| OpenToClose (this hub) | opentoclose | TC transaction management |
| HubSpot | hubspot | CRM — deal pipeline coordination |
| InvestorLift | investorlift | Wholesale marketplace |
| Buyer blast process | buyer-blast | Blast deals to buyers after TC open |
Open issues / TODOs
- Webhooks not documented in OTC API — using Zapier integration for event triggers; evaluate if native webhook support added post-2026-03-17
- OTC
api_datafield supports Follow Up Boss, Dotloop, Brokermint, SkySlope IDs — HubSpot deal-id association uses custom field approach; document the exact custom property name used - Document template IDs for RERI transaction types (
GET /v1/propertyTemplates/) — needed for automated property creation - Rate limit is strict at 1 req/sec — any bulk operations must implement mandatory 1.1s delay between calls
endpoints-parsed.json(91KB) is the machine-readable source for code generation — prefer over API.md for programmatic use
Recent activity
- 2026-05-03: hub created (W2-S9); sourced from
knowledge-base/opentoclose/API.md(verified 2026-03-17 live scrape)