spatial-laser
Off-Market

Off market flow

When an agent submits an offer request for an off-market property, ESO:

  1. looks up and inserts property details into the inventory_properties table
  2. awaits agent confirmation of property details
  3. creates an offer request in the offer_requests table, linking the property to the agent profile and property details
  4. ingests any property images to be stored in a private bucket

Upon successful submission, ESO pushes the offer request to SL via the API it provided:

ingest-eso-v2.sh
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
    "address": "123 Main Street",
    "city": "Springfield",
    "state": "IL",
    "zip": "62704",
    "status": "Available 2",
    "sqft": 1500,
    "asking": 250000.00,
    "beds": 34,
    "baths": 2.5,
    "yearBuilt": 1990,
    "propertyType": "Residential",
    "recordId": 333, // this is inventory_property_id in our system
    "lastModified": "2024-05-22T14:35:00",
    "meta": {
      "pool": "In-Ground Pool",
      "stories": 2,
      "lotSizeSqft": 5000,
      "numCoveredSpaces": 3,
      "hoa": "Yes",
      "hoaFee": 150.0,
      "hoaFrequency": "Monthly",
      "ageRestrictedCommunity": "No",
      "ageOfRoof": "5 years",
      "constructionType": "Brick",
      "basementExists": true,
      "basementFinishedSqft": 1000,
      "basementUnfinishedSqft": 500,
      "solar": true,
      "solarLeased": false,
      "solarPaidOff": true,
      "acUnitAge": "2 years",
      "waterHeaterAge": "3 years",
      "additionMade": "No",
      "occupancyStatus": "Owner Occupied",
      "comments": "Well-maintained property"
    }
  }' \
  ec2-3-235-170-15.compute-1.amazonaws.com:8055/rei/ingest-eso-v2

Analysts will then be able to underwrite the property in SL. Upon completion of the underwriting, the analyst will push the property to the buyers. SL will make the following call.

push-assumptions.sh
curl --location 'https: //v2.easystreetoffers.com/api/services/spatial-laser/off-market?token=<TOKEN_PROVIDED>' \
--header 'Content-Type: application/json' \
--data '{
    "property": {
        "sl_id": 1, // used during click through
        "inventory_property_id": 333 // this is the inventory_property_id in our system
    },
    "assumptions": {
        "ff_arv": 100,
        "ff_renovation_cost": 100,
        "inventory_property_id": 333, // this is the inventory_property_id in our system
        "ltr_annual_rent_increase": 100, // % increase
        "ltr_arv": 100,
        "ltr_monthly_rent": 100,
        "ltr_renovation_cost": 100,
        "property_annual_hoa": 100,
        "property_annual_tax": 100,
        "reno_items": [
            {
                "item_name": "wall",
                "reno_for_strategy": "str",
                "amount": 100
            },
            {
                "item_name": "kitchen",
                "reno_for_strategy": "ltr",
                "amount": 100
            },
            {
                "item_name": "carpet",
                "reno_for_strategy": "ff",
                "amount": 100
            },
            {
                "item_name": "bedroom splitting",
                "reno_for_strategy": "rr",
                "amount": 100
            }
        ],
        "rr_arv": 100,
        "rr_baths": 100,
        "rr_beds": 100,
        "rr_renovation_cost": 100,
        "rr_weekly_rent_per_room": 100,
        "str_arv": 100,
        "str_renovation_cost": 100,
        "str_season_1_daily_rate": 100,
        "str_season_2_daily_rate": 100,
        "str_season_3_daily_rate": 100,
        "str_season_4_daily_rate": 100,
        "fvm": 290000
    }
}'

Required property fields

  • sl_id: the SL ID of the property
  • inventory_property_id: This was sent as recordId in the original call to SL. It is the ID of the property in the inventory_properties table.

Required assumptions fields

The following fields are required for the assumptions object of any strategy:

  • property_annual_hoa
  • property_annual_tax
  • reno_items
Reno items

The reno_items field is an array of objects. Each object has the following fields:

  • item_name: name of the item
  • reno_for_strategy: the strategy that the item is used for
  • amount: the cost of the item
Required fields for each strategy
  • LTR strategy

    • ltr_annual_rent_increase
    • ltr_arv
    • ltr_monthly_rent
    • ltr_renovation_cost
  • STR strategy

    • str_arv
    • str_renovation_cost
    • str_season_1_daily_rate
    • str_season_2_daily_rate
    • str_season_3_daily_rate
    • str_season_4_daily_rate
  • RR strategy

    • rr_arv
    • rr_baths
    • rr_beds
    • rr_renovation_cost
    • rr_weekly_rent_per_room
  • FF strategy

    • ff_arv
    • ff_renovation_cost