Is a home actually being offered?

Saving a home is not the same as listing it. Havnly only offers a home to a household once its listing is complete — a partial listing cannot be approved, so putting one in front of an adjuster would waste everybody’s time.

Every write tells you where the home stands, so you never have to guess:

{
  "data": {
    "id": "fd418f4e-…",
    "api_external_id": "unit-4021",
    "listed": false,
    "missing_fields": ["description", "image_url", "available_from"],
    "availability_via": []
  }
}
  • listed: true — the home is live and can be matched today.
  • missing_fields — exactly what to send before it will be.
  • availability_via — how availability is being kept honest once it is live: complete_profile, plus calendar_synced, manual_blocks or available_dates.

The same three fields come back on GET /properties, so re-reading your portfolio tells you the state of every home without a call per home.

The whole portfolio at once

GET /properties/readiness
{
  "data": {
    "total": 1042,
    "listed": 819,
    "not_listed": 223,
    "blockers": [
      { "field": "image_url", "homes": 190 },
      { "field": "available_from", "homes": 64 },
      { "field": "pet_policy", "homes": 12 }
    ],
    "examples": [
      { "property_id": "…", "external_id": "unit-4021", "name": "…",
        "missing_fields": ["image_url"] }
    ]
  }
}

blockers is ranked, so the first line is the one worth fixing first: one mapping change that supplies image_url moves 190 homes onto the market at once. examples gives you twenty homes to check the fix against without paging the whole portfolio.

This is the call to run after a bulk import, and the one to watch afterwards. A thousand homes that all save successfully and none of which is listed looks identical to a thousand homes that are working — until a month has passed with no bookings.

The required fields

FieldNote
address, bedrooms, bathrooms, sqftThe basics
monthly_rateMust be above zero
image_urlAt least one photograph
descriptionFree text
amenitiesA non-empty array
pet_policySay “No pets” rather than leaving it empty
available_fromAlso the simplest way to satisfy availability
security_deposit, cleaning_fee, application_fee, pet_feeSend 0 where they do not apply — zero is an answer, absent is not
furnished_statusfurnished, partial or unfurnished

The commonest near-miss is a fee left out rather than set to zero. 0 makes a home live; omitting it does not.

Testing without polluting the market

A home published with a sandbox key is marked as test data. It is a normal home to you — it appears in your portfolio, it becomes listed once complete, and a sandbox housing request will match it — but no real household will ever be offered it.

So you can publish a hundred fake homes, watch listed flip, exercise the whole flow, and not have a displaced family shown a property that does not exist. Clean them up when you are done, or leave them; either way they stay out of real matching.