Architecture
Integration pattern
Your frontend renders SDK components. Those components talk to your backend, not to Opendoor. Your backend uses the server SDK to forward requests to the Opendoor API.
Browser (React / Vue) → client-js-core → your backend → server-js-core → Opendoor APIThe API key stays on your server. The browser SDK only knows about your backend’s URL.
Packages
server-js-core — Node.js client for your backend. Wraps the Opendoor Partnerships API (GraphQL for offers, REST for address autocomplete). You set up proxy routes like POST /api/opendoor/v1/offer/create and the SDK handles the rest.
client-js-core — Browser HTTP client. Makes typed fetch calls to your backend at /api/opendoor/v1/*. No framework dependency — works with React, Vue, or anything else. Also defines the OpendoorAppearance theming contract shared across all UI packages.
client-react — React components: AddressEntry, AddressMap, AddressUnitConfirmation, QualificationQuestions, DtcOnboardingFlow. Wrapped in an OpendoorProvider context. Themed via the appearance prop.
client-vue — Vue 3 components: AddressEntry, AddressMap, AddressUnitConfirmation, DtcOnboardingFlow. These render identically to their React counterparts — partners switching frameworks get the same UI without re-implementing anything. Uses provide/inject and @kebab-case emits instead of React Context and callback props.
Telemetry
SDK components send anonymous usage events to Opendoor (page views, button clicks, field identifiers, address data on selection). This powers conversion funnel reporting.
Not collected: personal info, answer values, API keys, cookies. Telemetry uses an anonymous localStorage identifier on your domain.
Your own analytics
Use lifecycle callbacks to pipe events to your analytics:
onReady/@ready— component mountedonAddressSelect/@address-select— address chosenonPageChange/@page-change— page navigationonSubmit/@submit— questionnaire completed
See the component guides for the full callback reference.