Skip to content

Address Details & Value Estimation

The getAddressDetails() method lets you check whether an address is eligible for an Opendoor offer and retrieve a preliminary value estimate — without creating an offer. Use this to power “Estimated cash offer” cards on property listing pages.

How it works

Partner listing page
├─ Call getAddressDetails(address)
├─ If eligible + valueEstimate:
│ Show "Estimated cash offer: $lower – $upper"
│ CTA → navigate to DTC questionnaire
└─ If not eligible:
Don't show the card

Backend setup

Add a BFF route that calls getAddressDetails():

server.ts
import { OpendoorClient } from '@opendoor/partner-sdk-server-js-core';
const opendoor = new OpendoorClient({
apiKey: process.env.OPENDOOR_API_KEY!,
});
app.post('/api/opendoor/v1/address/details', async (req, res) => {
const { address, trackingId } = req.body;
const result = await opendoor.getAddressDetails(address, trackingId);
res.json(result);
});

Browser usage

import { OpendoorClient } from '@opendoor/partner-sdk-client-js-core';
const client = new OpendoorClient({ baseURL: '/api/opendoor/v1' });
const result = await client.getAddressDetails({
address: {
street1: '123 Main St',
city: 'Pleasanton',
state: 'CA',
postalCode: '94566',
},
});
const sell = result.products.homeSell[0];
if (sell.isEligible && sell.valueEstimate) {
// Show the card
console.log(
`$${sell.valueEstimate.lower.toLocaleString()} – $${sell.valueEstimate.upper.toLocaleString()}`
);
}

Response shape

interface GetAddressDetailsResponse {
products: {
homeSell: SellProduct[];
};
}
interface SellProduct {
isEligible: boolean;
denialCode: string | null;
denialExplanation: string | null;
valueEstimate: ValueEstimate | null;
referral: Referral | null;
}
interface ValueEstimate {
lower: number; // Low end of estimate
upper: number; // High end of estimate
}
interface Referral {
url: string; // Opendoor seller flow URL with referral tracking
}

Key behaviors

  • If isEligible is false, both valueEstimate and referral will be null
  • Even when isEligible is true, valueEstimate can still be null in some cases — always check before rendering
  • homeSell is an array but currently always contains a single entry
  • Values in valueEstimate are in dollars (not cents)

Referral tracking

Pass an optional trackingId to attribute referrals to your tracking system:

const result = await client.getAddressDetails({
address: myAddress,
trackingId: 'session-abc-123',
});
// The referral URL will include your tracking ID:
// https://partner.opendoor.com/api/v1/addresses/...?trackingId=session-abc-123

Integration with DTC Onboarding Flow

The typical partner flow combines getAddressDetails() with the DTC questionnaire:

  1. Listing page: Call getAddressDetails(address) → show value estimate card
  2. User clicks CTA: Navigate to your DTC integration page with the address
  3. DTC page: Call createOffer(address)getHomeDetail() → render DtcOnboardingFlow
  4. User completes flow: Call updateOffer() with the questionnaire answers

The address details check is separate from the offer flow — no offer is created until the user clicks through.

Denial codes

When isEligible is false, the response includes a denialCode and denialExplanation. See the Opendoor API docs for the full list of denial codes.