TOOLS.md - Dispo Agent

HubSpot (Portal 6193101)

  • PAT: /home/opsadmin/.openclaw/workspace/data/hubspot-pat.txt
  • Base URL: https://api.hubapi.com
  • Pipeline: Wholesale (816046)
  • Contact search: POST /crm/v3/objects/contacts/search
  • Deal CRUD: GET/PATCH /crm/v3/objects/deals/{id}
  • Custom objects: See FIELDS.md for type IDs

SalesMsg (API v2.2)

  • Base URL: https://api.salesmessage.com/pub/v2.2
  • OAuth token: /home/opsadmin/.openclaw/workspace/data/salesmessage-oauth.json (auto-refreshed every 6h)
  • Send SMS: POST /messages{ phone_number, message, inbox_id }
  • Tags: POST /tags (create), POST /contacts/{id}/tags (apply)
  • Contacts: GET /contacts?phone={phone}&limit=1
  • Saved Replies: Use for initial address request responses

Inbox IDs

InboxIDUse
Dispo A128279Channel 1 (personalized) + Channel 2 (CRMLS) + Channel 4 (PropStream)
End Buyer CA143887Channel 3 (InvestorBase) — CA deals
End Buyer FL160031Channel 3 (InvestorBase) — FL deals

Supabase (svueekfvfrvhylxygktb)

  • URL: https://svueekfvfrvhylxygktb.supabase.co
  • Key: Service role key in webhook handlers

Tables

TablePurpose
deal_reviewsHubSpot deal mirror (15-min sync + real-time webhook)
deal_review_activityAll deal events and changes
dispo_blast_recipientsAll blast sends across 4 channels
dispo_property_interestDetected buyer interest (address req, offer, showing)
conversationsLead tracking with hot_lead_score
salesmsg_inboxAll SalesMsg messages (inbound/outbound)
salesmsg_eventsRaw webhook events
call_eventsCall recordings, voicemails, transcripts
messagesAll messages with conversation threading

Discord

  • Dispo Offers Webhook: Posts embed when offer detected
  • Alert channel: socal-dispo — OFFERS ONLY (not address requests)

External Sources

SourceAuthScript
CRMLSPlaywright login (Cv47512)dispo-crmls-agent-blast.js
InvestorLiftCookie-based via gateway (:3848)dispo-investorbase-blast.js
PropStreamPlaywright logindispo-propstream-blast.js

Scripts

ScriptPurpose
dispo-blast-engine.jsCore engine — triggers all 4 channels
dispo-buyer-scorer.js10-factor buyer scoring (0-100)
dispo-crmls-agent-blast.jsChannel 2 — CRMLS agent blast
dispo-investorbase-blast.jsChannel 3 — InvestorBase end buyers
dispo-propstream-blast.jsChannel 4 — PropStream flippers
tag-automation-handler.jsTag suffix parsing + custom object creation
hubspot-custom-object-manager.jsCRUD for Offers, Showings, Views, Referrals
hubspot-deal-sync.js15-min HubSpot → Supabase sync

Webhooks

EndpointPortHandler
/webhook/hubspot18790Deal property changes, stage changes
/actions/dispo-blast18790Trigger blast for a deal
/webhooks/salesmessage18793SalesMsg events → intent detection → auto-response

Skills (Claude Code) — added 2026-04-28

Dispo owns 1 skill covering buyer-side blast across 4 channels. READ the skill’s SKILL.md before working in this domain.

SkillPathPurposeAudit recipe
dispo-blast~/.claude/skills/dispo-blast/4-channel buyer blast: InvestorBase end-buyers, CRMLS agents, PropStream flippers, showing-day. Wraps dispo-blast-engine.js (4-channel coordinator) + per-channel scripts (dispo-crmls-agent-blast.js, dispo-investorbase-blast.js, dispo-propstream-blast.js, showing-blast-generic.js, showing-blast-compiled.js, w4-broadcast-blast.js, audit-blast-responses.js) + IB scoring/history libsdocs/HANDOFF-FOR-KIMI.md

Rules:

  • 4 history checks BEFORE every blast: already-blasted (7d), recent-engagement (14d), saturation (≥3 in 7d), suppression
  • IB fit score ≥60 to send (zip 25%, beds 15%, price 20%, condition 20%, recent 10%, velocity 10%)
  • NEVER run any blast script without --dry-run unless Henry explicitly authorizes a live blast
  • Inbound replies route to acquisitions-followup skill (it handles classification across all channels)

Cross-reference: project_skill_suite_il_outreach_pipeline.md

Perplexity Pro (web research with citations)

  • Purpose: Real-time web data with citations — for per-deal research (comp validation, market context, CH/buyer-side intel) and nightly batch intel
  • Auth: Cookie session (Henry’s 0 marginal cost per call)
  • Wrapper: /home/opsadmin/.openclaw/tools/perplexity-cookie-session/comprehensive_wrapper.py
  • Modes: ask (free auto), search (1 Pro query), reason (1 Pro query, thinking models), deep_research (1 Pro query, ~85s agentic)
  • Per-deal usage (preferred for live CH/buyer threads):
    from comprehensive_wrapper import PerplexityPro
    pp = PerplexityPro.from_env()
    r = pp.search("Recent comps for [address], 90d window", model="claude-sonnet-4.6", sources=["web"])
  • Nightly batch intel: /home/opsadmin/.openclaw/workspace/scripts/dispo_perplexity_collector.py — buyer-pool intel (4 cited queries: cash buyer activity, wholesale close signals, flipper demand, rate sensitivity). Output: /tmp/dispo-perplexity-intel-{date}.{json,md}
  • Skill: /perplexity (Claude Code skill loader)
  • API tier (alternative): POST http://127.0.0.1:18900/v1/chat/completions with model=sonar / sonar-pro / sonar-reasoning-pro — bills against $5/mo API credit + per-call rates. Use for high-volume / cached scenarios.
  • Quotas: 400 cookie Pro queries/day total (soft alert via daily_summary.py); 30 deep_research/day
  • KB: workspace/knowledge-base/perplexity/ (6 docs)