Skip to the documentation

Headless search

A request kept so it can run again. Results stay on the execution and do not appear under Searches or Clients.

POST/api/v1/search

Headless path. Saves a request and queues its first run. The run is an execution with no match: results stay on the execution only and do not appear in Searches or Clients. Prefer POST /api/v1/searches/{searchId}/matches when the work should show up in the app.

It answers 202 at once. Location is the execution to poll — GET that same URL until status is succeeded, failed or canceled, honoring Retry-After between reads. When succeeded, result (with shortlist) is on that same response. See Runs and polling.

Send an Idempotency-Key. A network error after you sent the request leaves you not knowing whether a run started, and a second run spends a second match. With the key, a retry replays the first answer instead.

A start counts one match against the org's monthly allowance and against the person's own limit, and the run is recorded against the key that started it.

An API key carrying the scope named here, or a signed-in session.

Scope
search:run
Key kinds
PersonalOrganization

Required and optional fields, allowed values and errors, as the page shows them.

Parameters

NameInTypeRequiredDescription
Idempotency-KeyHeaderstringOptionalA value of your own for this attempt. The same key with the same request replays the first answer (Idempotent-Replayed: true) and starts nothing new; the same key with a different request is 409. A key is remembered for as long as its run exists.

Request body

The whole request. location, price.max, beds.min and baths.min are required, and so is a place to start from: a commute, a preferred area, or location.center. Unknown fields are refused, so a typo fails loudly.

Fields (87)
FieldTypeRequiredDescription
version1Optionaldefault 1
clientIdstring (uuid) | nullOptionaldefault null
labelstring | nullOptional1 to 120 characters, default null
listingType"buy" | "rent"Optionaldefault "buy"
locationobjectRequired
location.labelstringRequired1 to 120 characters
location.centerobjectOptional
location.center.latnumberRequired-90 to 90
location.center.lngnumberRequired-180 to 180
priceobjectRequired
price.minnumberOptional0 to 100000000
price.maxnumberRequired0 to 100000000
price.budgetnumberOptional0 to 100000000
bedsobjectRequired
beds.minintegerRequired0 to 20
beds.targetintegerOptional0 to 20
bathsobjectRequired
baths.minnumberRequired0 to 20
baths.targetnumberOptional0 to 20
sqftobjectOptional
sqft.minnumberOptional0 to 100000
sqft.maxnumberOptional0 to 100000
propertyTypes("single-family" | "condo" | "townhome" | "multi-family" | "manufactured" | "land")[]Optionalat most 6 items, default []
commutesobject[]Optionalat most 3 items, default []
commutes[].labelstringRequired1 to 80 characters
commutes[].latnumberOptional-90 to 90
commutes[].lngnumberOptional-180 to 180
commutes[].maxMinutesintegerRequired0 to 120
commutes[].anyOfstringOptional1 to 80 characters
pinsobject[]Optionalat most 4 items
pins[].idstringRequired1 to 64 characters
pins[].latnumberRequired-90 to 90
pins[].lngnumberRequired-180 to 180
areasobject[]Optionalat most 10 items, default []
areas[].namestringRequired1 to 80 characters
areas[].latnumberRequired-90 to 90
areas[].lngnumberRequired-180 to 180
areas[].weightintegerOptional1 to 10, default 5
areas[].kind"city" | "neighborhood"Optional
areas[].radiusMilesnumberOptional0.25 to 25
mustHavesstring[]Optionalat most 20 items, default []
niceToHavesstring[]Optionalat most 20 items, default []
dealBreakersstring[]Optionalat most 20 items, default []
idealHomestring | nullOptionalat most 4000 characters, default null
idealHomeImportance"nice" | "must"Optional
dislikesstring | nullOptionalat most 2000 characters, default null
movingReasonstring | nullOptionalat most 500 characters, default null
lifestyleobjectOptionaldefault {"household":null,"hasKids":null,"kidsAges":null,"schoolPriority":null,"workFromHome":null,"wfhDaysPerWeek":null,"noiseSensitive":null,"yardImportance":null,"hasPets":null,"petType":null,"renovationTolerance":null,"hoaPreference":null,"neighborhoodVibe":null,"weekendLifestyle":null}
lifestyle.householdstring | nullOptionalat most 120 characters, default null
lifestyle.hasKidsboolean | nullOptionaldefault null
lifestyle.kidsAgesstring | nullOptionalat most 60 characters, default null
lifestyle.schoolPriority"critical" | "important" | "nice" | "none" | nullOptionaldefault null
lifestyle.workFromHomeboolean | nullOptionaldefault null
lifestyle.wfhDaysPerWeeknumber | nullOptional0 to 7, default null
lifestyle.noiseSensitiveboolean | nullOptionaldefault null
lifestyle.yardImportance"critical" | "important" | "nice" | "none" | nullOptionaldefault null
lifestyle.hasPetsboolean | nullOptionaldefault null
lifestyle.petTypestring | nullOptionalat most 60 characters, default null
lifestyle.renovationTolerance"none" | "minor" | "major" | nullOptionaldefault null
lifestyle.hoaPreference"avoid" | "ok" | "prefer" | nullOptionaldefault null
lifestyle.neighborhoodVibestring | nullOptionalat most 200 characters, default null
lifestyle.weekendLifestylestring | nullOptionalat most 200 characters, default null
neighbourhood("safe-low-crime" | "great-schools" | "walkable-lively" | "near-parks" | "quiet-residential" | "up-and-coming")[]Optionalat most 6 items, default []
vibeobjectOptionaldefault {"tags":[],"urbanToQuiet":50,"moveInToProject":50}
vibe.tagsstring[]Optionalat most 12 items, default []
vibe.urbanToQuietintegerOptional0 to 100, default 50
vibe.moveInToProjectintegerOptional0 to 100, default 50
tasteReactionsobject[]Optionalat most 23 items, default []
tasteReactions[].cardId"views-city" | "views-mountain" | "views-water" | "views-treetops" | "light-floor-ceiling" | "light-bright-airy" | "light-cozy" | "kitchen-gourmet" | "kitchen-family" | "kitchen-minimal" | "outdoor-pool" | "outdoor-garden" | "outdoor-balcony" | "outdoor-minimal" | "living-open" | "living-rooms" | "living-loft" | "office-dedicated" | "office-flex" | "office-none" | "cond-move-in" | "cond-updates" | "cond-project"Required
tasteReactions[].reaction"love" | "pass"Required
inspirationsobject[]Optional1 to 4 items
inspirations[].listingKeystringOptional1 to 100 characters
inspirations[].addressstringOptional1 to 200 characters
inspirations[].pricenumberOptional0 to 100000000
inspirations[].bedsintegerOptional0 to 20
inspirations[].bathsnumberOptional0 to 20
inspirations[].sqftnumberOptional0 to 100000
inspirations[].descriptionstringOptional1 to 300 characters
inspirations[].styleSignalsstring[]Optionalat most 10 items
inspirationImportance"nice" | "must"Optional
callbackUrlstringOptional1 to 2000 characters
includeComingSoonbooleanOptionaldefault true
onMarketSincestring (date) | nullOptionaldefault null
optionsobjectOptionaldefault {"shortlist":4,"grade":25,"photos":8}
options.shortlistintegerOptional1 to 12, default 4
options.gradeintegerOptional1 to 40, default 25
options.photosintegerOptional0 to 8, default 8
Examples
{
  "label": "Okafors, East Nashville",
  "listingType": "buy",
  "location": {
    "label": "Nashville, TN",
    "center": {
      "lat": 36.1627,
      "lng": -86.7816
    }
  },
  "price": {
    "min": 450000,
    "max": 750000
  },
  "beds": {
    "min": 3
  },
  "baths": {
    "min": 2
  },
  "sqft": {
    "min": 1800
  },
  "propertyTypes": [
    "single-family"
  ],
  "commutes": [
    {
      "label": "Vanderbilt University Medical Center",
      "lat": 36.1421,
      "lng": -86.8016,
      "maxMinutes": 25
    }
  ],
  "mustHaves": [
    "Fenced yard",
    "Walkable to coffee"
  ],
  "niceToHaves": [
    "Home office"
  ],
  "dealBreakers": [
    "Busy road"
  ],
  "idealHome": "A renovated bungalow with big windows and a porch, close to the park.",
  "neighbourhood": [
    "great-schools",
    "walkable-lively"
  ],
  "options": {
    "shortlist": 4
  }
}

Examples

curl -X POST "https://liviamatch.com/api/v1/search" \
  -H "Authorization: Bearer $LIVIA_API_KEY" \
  -H "Idempotency-Key: okafor-east-nashville-1" \
  -H "Content-Type: application/json" \
  -d '{
  "label": "Okafors, East Nashville",
  "listingType": "buy",
  "location": {
    "label": "Nashville, TN",
    "center": {
      "lat": 36.1627,
      "lng": -86.7816
    }
  },
  "price": {
    "min": 450000,
    "max": 750000
  },
  "beds": {
    "min": 3
  },
  "baths": {
    "min": 2
  },
  "sqft": {
    "min": 1800
  },
  "propertyTypes": [
    "single-family"
  ],
  "commutes": [
    {
      "label": "Vanderbilt University Medical Center",
      "lat": 36.1421,
      "lng": -86.8016,
      "maxMinutes": 25
    }
  ],
  "mustHaves": [
    "Fenced yard",
    "Walkable to coffee"
  ],
  "niceToHaves": [
    "Home office"
  ],
  "dealBreakers": [
    "Busy road"
  ],
  "idealHome": "A renovated bungalow with big windows and a porch, close to the park.",
  "neighbourhood": [
    "great-schools",
    "walkable-lively"
  ],
  "options": {
    "shortlist": 4
  }
}'

Responses

202

The search was saved and a run queued. The same answer replays for a repeated Idempotency-Key.

HeadersLocationRetry-AfterIdempotent-Replayed

A run, just queued
{
  "data": {
    "search": {
      "id": "6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
      "label": "Okafors, East Nashville",
      "clientId": null,
      "revision": 1,
      "request": {
        "version": 1,
        "clientId": null,
        "label": "Okafors, East Nashville",
        "listingType": "buy",
        "location": {
          "label": "Nashville, TN",
          "center": {
            "lat": 36.1627,
            "lng": -86.7816
          }
        },
        "price": {
          "min": 450000,
          "max": 750000
        },
        "beds": {
          "min": 3
        },
        "baths": {
          "min": 2
        },
        "sqft": {
          "min": 1800
        },
        "propertyTypes": [
          "single-family"
        ],
        "commutes": [
          {
            "label": "Vanderbilt University Medical Center",
            "lat": 36.1421,
            "lng": -86.8016,
            "maxMinutes": 25
          }
        ],
        "areas": [],
        "mustHaves": [
          "Fenced yard",
          "Walkable to coffee"
        ],
        "niceToHaves": [
          "Home office"
        ],
        "dealBreakers": [
          "Busy road"
        ],
        "idealHome": "A renovated bungalow with big windows and a porch, close to the park.",
        "dislikes": null,
        "movingReason": null,
        "lifestyle": {
          "household": null,
          "hasKids": null,
          "kidsAges": null,
          "schoolPriority": null,
          "workFromHome": null,
          "wfhDaysPerWeek": null,
          "noiseSensitive": null,
          "yardImportance": null,
          "hasPets": null,
          "petType": null,
          "renovationTolerance": null,
          "hoaPreference": null,
          "neighborhoodVibe": null,
          "weekendLifestyle": null
        },
        "neighbourhood": [
          "great-schools",
          "walkable-lively"
        ],
        "vibe": {
          "tags": [],
          "urbanToQuiet": 50,
          "moveInToProject": 50
        },
        "tasteReactions": [],
        "includeComingSoon": true,
        "onMarketSince": null,
        "options": {
          "shortlist": 4,
          "grade": 25,
          "photos": 8
        }
      },
      "createdAt": "2026-10-02T14:03:11.402Z",
      "updatedAt": "2026-10-02T14:03:11.402Z",
      "latestExecution": {
        "id": "0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83",
        "searchId": "6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
        "status": "queued",
        "step": null,
        "stepLabel": null,
        "attempts": 0,
        "progress": {
          "done": 0,
          "total": 9,
          "percent": 0
        },
        "createdAt": "2026-10-02T14:03:12.118Z",
        "startedAt": null,
        "finishedAt": null,
        "heartbeatAt": null,
        "links": {
          "self": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions/0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83",
          "search": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
          "cancel": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions/0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83/cancel"
        }
      },
      "links": {
        "self": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
        "run": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
        "executions": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions"
      }
    },
    "execution": {
      "id": "0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83",
      "searchId": "6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
      "status": "queued",
      "step": null,
      "stepLabel": null,
      "attempts": 0,
      "progress": {
        "done": 0,
        "total": 9,
        "percent": 0
      },
      "createdAt": "2026-10-02T14:03:12.118Z",
      "startedAt": null,
      "finishedAt": null,
      "heartbeatAt": null,
      "links": {
        "self": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions/0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83",
        "search": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
        "cancel": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions/0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83/cancel"
      }
    }
  }
}
Fields (138)
FieldTypeDescription
dataobject
data.searchobject
data.search.idstring (uuid)
data.search.labelstring | null
data.search.clientIdstring (uuid) | null
data.search.revisionintegerCounts up on every save. The same number is the ETag.at least 1
data.search.requestobjectThe request as saved, every default filled in.
data.search.request.version1default 1
data.search.request.clientIdstring (uuid) | nulldefault null
data.search.request.labelstring | null1 to 120 characters, default null
data.search.request.listingType"buy" | "rent"default "buy"
data.search.request.locationobject
data.search.request.location.labelstring1 to 120 characters
data.search.request.location.centerobject, optional
data.search.request.location.center.latnumber-90 to 90
data.search.request.location.center.lngnumber-180 to 180
data.search.request.priceobject
data.search.request.price.minnumber, optional0 to 100000000
data.search.request.price.maxnumber0 to 100000000
data.search.request.price.budgetnumber, optional0 to 100000000
data.search.request.bedsobject
data.search.request.beds.mininteger0 to 20
data.search.request.beds.targetinteger, optional0 to 20
data.search.request.bathsobject
data.search.request.baths.minnumber0 to 20
data.search.request.baths.targetnumber, optional0 to 20
data.search.request.sqftobject, optional
data.search.request.sqft.minnumber, optional0 to 100000
data.search.request.sqft.maxnumber, optional0 to 100000
data.search.request.propertyTypes("single-family" | "condo" | "townhome" | "multi-family" | "manufactured" | "land")[]at most 6 items, default []
data.search.request.commutesobject[]at most 3 items, default []
data.search.request.commutes[].labelstring1 to 80 characters
data.search.request.commutes[].latnumber, optional-90 to 90
data.search.request.commutes[].lngnumber, optional-180 to 180
data.search.request.commutes[].maxMinutesinteger0 to 120
data.search.request.commutes[].anyOfstring, optional1 to 80 characters
data.search.request.pinsobject[], optionalat most 4 items
data.search.request.pins[].idstring1 to 64 characters
data.search.request.pins[].latnumber-90 to 90
data.search.request.pins[].lngnumber-180 to 180
data.search.request.areasobject[]at most 10 items, default []
data.search.request.areas[].namestring1 to 80 characters
data.search.request.areas[].latnumber-90 to 90
data.search.request.areas[].lngnumber-180 to 180
data.search.request.areas[].weightinteger1 to 10, default 5
data.search.request.areas[].kind"city" | "neighborhood", optional
data.search.request.areas[].radiusMilesnumber, optional0.25 to 25
data.search.request.mustHavesstring[]at most 20 items, default []
data.search.request.niceToHavesstring[]at most 20 items, default []
data.search.request.dealBreakersstring[]at most 20 items, default []
data.search.request.idealHomestring | nullat most 4000 characters, default null
data.search.request.idealHomeImportance"nice" | "must", optional
data.search.request.dislikesstring | nullat most 2000 characters, default null
data.search.request.movingReasonstring | nullat most 500 characters, default null
data.search.request.lifestyleobjectdefault {"household":null,"hasKids":null,"kidsAges":null,"schoolPriority":null,"workFromHome":null,"wfhDaysPerWeek":null,"noiseSensitive":null,"yardImportance":null,"hasPets":null,"petType":null,"renovationTolerance":null,"hoaPreference":null,"neighborhoodVibe":null,"weekendLifestyle":null}
data.search.request.lifestyle.householdstring | nullat most 120 characters, default null
data.search.request.lifestyle.hasKidsboolean | nulldefault null
data.search.request.lifestyle.kidsAgesstring | nullat most 60 characters, default null
data.search.request.lifestyle.schoolPriority"critical" | "important" | "nice" | "none" | nulldefault null
data.search.request.lifestyle.workFromHomeboolean | nulldefault null
data.search.request.lifestyle.wfhDaysPerWeeknumber | null0 to 7, default null
data.search.request.lifestyle.noiseSensitiveboolean | nulldefault null
data.search.request.lifestyle.yardImportance"critical" | "important" | "nice" | "none" | nulldefault null
data.search.request.lifestyle.hasPetsboolean | nulldefault null
data.search.request.lifestyle.petTypestring | nullat most 60 characters, default null
data.search.request.lifestyle.renovationTolerance"none" | "minor" | "major" | nulldefault null
data.search.request.lifestyle.hoaPreference"avoid" | "ok" | "prefer" | nulldefault null
data.search.request.lifestyle.neighborhoodVibestring | nullat most 200 characters, default null
data.search.request.lifestyle.weekendLifestylestring | nullat most 200 characters, default null
data.search.request.neighbourhood("safe-low-crime" | "great-schools" | "walkable-lively" | "near-parks" | "quiet-residential" | "up-and-coming")[]at most 6 items, default []
data.search.request.vibeobjectdefault {"tags":[],"urbanToQuiet":50,"moveInToProject":50}
data.search.request.vibe.tagsstring[]at most 12 items, default []
data.search.request.vibe.urbanToQuietinteger0 to 100, default 50
data.search.request.vibe.moveInToProjectinteger0 to 100, default 50
data.search.request.tasteReactionsobject[]at most 23 items, default []
data.search.request.tasteReactions[].cardId"views-city" | "views-mountain" | "views-water" | "views-treetops" | "light-floor-ceiling" | "light-bright-airy" | "light-cozy" | "kitchen-gourmet" | "kitchen-family" | "kitchen-minimal" | "outdoor-pool" | "outdoor-garden" | "outdoor-balcony" | "outdoor-minimal" | "living-open" | "living-rooms" | "living-loft" | "office-dedicated" | "office-flex" | "office-none" | "cond-move-in" | "cond-updates" | "cond-project"
data.search.request.tasteReactions[].reaction"love" | "pass"
data.search.request.inspirationsobject[], optional1 to 4 items
data.search.request.inspirations[].listingKeystring, optional1 to 100 characters
data.search.request.inspirations[].addressstring, optional1 to 200 characters
data.search.request.inspirations[].pricenumber, optional0 to 100000000
data.search.request.inspirations[].bedsinteger, optional0 to 20
data.search.request.inspirations[].bathsnumber, optional0 to 20
data.search.request.inspirations[].sqftnumber, optional0 to 100000
data.search.request.inspirations[].descriptionstring, optional1 to 300 characters
data.search.request.inspirations[].styleSignalsstring[], optionalat most 10 items
data.search.request.inspirationImportance"nice" | "must", optional
data.search.request.callbackUrlstring, optional1 to 2000 characters
data.search.request.includeComingSoonbooleandefault true
data.search.request.onMarketSincestring (date) | nulldefault null
data.search.request.optionsobjectdefault {"shortlist":4,"grade":25,"photos":8}
data.search.request.options.shortlistinteger1 to 12, default 4
data.search.request.options.gradeinteger1 to 40, default 25
data.search.request.options.photosinteger0 to 8, default 8
data.search.createdAtstring (date-time)
data.search.updatedAtstring (date-time)
data.search.latestExecutionobject | nullThe newest run, or null when the search was saved and never run.
data.search.latestExecution.idstring (uuid)The run's id.
data.search.latestExecution.searchIdstring (uuid)
data.search.latestExecution.status"queued" | "running" | "succeeded" | "failed" | "canceled"queued and running are unfinished: keep polling. succeeded, failed and canceled are final.
data.search.latestExecution.step"area" | "gather" | "weigh" | "score" | "enrich" | "inspire" | "grade" | "finalize" | "compliance" | nullThe play the run is on, or null before it starts and after it ends.
data.search.latestExecution.stepLabelstring | nullThat play in words for a person.
data.search.latestExecution.attemptsintegerHow many times a driver has claimed the run. More than one means it resumed after a crash or a deadline.
data.search.latestExecution.progressobject
data.search.latestExecution.progress.doneintegerPlays finished.
data.search.latestExecution.progress.totalintegerPlays in a run.
data.search.latestExecution.progress.percentintegerHow far along, 0 to 100. It moves inside a long play.0 to 100
data.search.latestExecution.createdAtstring (date-time)
data.search.latestExecution.startedAtstring (date-time) | null
data.search.latestExecution.finishedAtstring (date-time) | null
data.search.latestExecution.heartbeatAtstring (date-time) | nullWhen the engine last checked in. Null before a claim. A running run that goes quiet here has stalled.
data.search.latestExecution.linksobjectWhere to read this run, its search, and where to POST to cancel it.
data.search.latestExecution.links.selfstring
data.search.latestExecution.links.searchstring
data.search.latestExecution.links.cancelstring
data.search.linksobject
data.search.links.selfstring
data.search.links.runstring
data.search.links.executionsstring
data.executionobject
data.execution.idstring (uuid)The run's id.
data.execution.searchIdstring (uuid)
data.execution.status"queued" | "running" | "succeeded" | "failed" | "canceled"queued and running are unfinished: keep polling. succeeded, failed and canceled are final.
data.execution.step"area" | "gather" | "weigh" | "score" | "enrich" | "inspire" | "grade" | "finalize" | "compliance" | nullThe play the run is on, or null before it starts and after it ends.
data.execution.stepLabelstring | nullThat play in words for a person.
data.execution.attemptsintegerHow many times a driver has claimed the run. More than one means it resumed after a crash or a deadline.
data.execution.progressobject
data.execution.progress.doneintegerPlays finished.
data.execution.progress.totalintegerPlays in a run.
data.execution.progress.percentintegerHow far along, 0 to 100. It moves inside a long play.0 to 100
data.execution.createdAtstring (date-time)
data.execution.startedAtstring (date-time) | null
data.execution.finishedAtstring (date-time) | null
data.execution.heartbeatAtstring (date-time) | nullWhen the engine last checked in. Null before a claim. A running run that goes quiet here has stalled.
data.execution.linksobjectWhere to read this run, its search, and where to POST to cancel it.
data.execution.links.selfstring
data.execution.links.searchstring
data.execution.links.cancelstring

Errors

StatusCodeWhen
400invalidThe request failed validation; issues names each field.
400invalid-jsonThe body is not JSON.
400invalid-idempotency-keyThe Idempotency-Key is malformed.
402out-of-creditsThe org has no matches left this month.
402person-limit-reachedThe person the key acts as has used their own monthly matches.
409idempotency-key-reusedThe Idempotency-Key was used for a different request.
413too-largeThe body is over 64 KiB.
422unknown-clientclientId is not a client in the workspace.
422callback-url-refusedThe callbackUrl is plain http to localhost on a deployment that is not development.
422callback-needs-keyThe run names a callbackUrl but was started without an API key.
422no-signing-secretThe run names a callbackUrl and the key has no signing secret.
429rate-limitedThe hourly cap on starting runs is spent (the answer has no RateLimit header).
429too-many-active3 runs are already queued or running.
503search-unavailableAn outside service the run needs is not configured here.
503studio-incompleteA prompt the match engine runs is incomplete in Livia's AI settings; issues names the step. Nothing was started or spent.

Any call of this kind can also answer401 unauthenticated401 invalid-api-key403 insufficient-scope429 monthly-cap-reached500 internal

List searches

GET/api/v1/search

The caller's saved searches, newest first, each with its newest run. Pages by cursor: follow links.next until it is null.

An API key carrying the scope named here, or a signed-in session.

Scope
search:read
Key kinds
PersonalOrganization

Required and optional fields, allowed values and errors, as the page shows them.

Parameters

NameInTypeRequiredDescription
limitQueryintegerOptionalHow many to return: 1 to 50, 20 when absent. A number outside that range is clamped; text is ignored.
cursorQuerystringOptionalWhere the last page ended: the cursor inside the previous page's links.next. Pass links as given; a cursor you edit is refused.

Examples

curl "https://liviamatch.com/api/v1/search" \
  -H "Authorization: Bearer $LIVIA_API_KEY"

Responses

200

One page of searches.

The last page
{
  "data": [
    {
      "id": "6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
      "label": "Okafors, East Nashville",
      "clientId": null,
      "revision": 1,
      "request": {
        "version": 1,
        "clientId": null,
        "label": "Okafors, East Nashville",
        "listingType": "buy",
        "location": {
          "label": "Nashville, TN",
          "center": {
            "lat": 36.1627,
            "lng": -86.7816
          }
        },
        "price": {
          "min": 450000,
          "max": 750000
        },
        "beds": {
          "min": 3
        },
        "baths": {
          "min": 2
        },
        "sqft": {
          "min": 1800
        },
        "propertyTypes": [
          "single-family"
        ],
        "commutes": [
          {
            "label": "Vanderbilt University Medical Center",
            "lat": 36.1421,
            "lng": -86.8016,
            "maxMinutes": 25
          }
        ],
        "areas": [],
        "mustHaves": [
          "Fenced yard",
          "Walkable to coffee"
        ],
        "niceToHaves": [
          "Home office"
        ],
        "dealBreakers": [
          "Busy road"
        ],
        "idealHome": "A renovated bungalow with big windows and a porch, close to the park.",
        "dislikes": null,
        "movingReason": null,
        "lifestyle": {
          "household": null,
          "hasKids": null,
          "kidsAges": null,
          "schoolPriority": null,
          "workFromHome": null,
          "wfhDaysPerWeek": null,
          "noiseSensitive": null,
          "yardImportance": null,
          "hasPets": null,
          "petType": null,
          "renovationTolerance": null,
          "hoaPreference": null,
          "neighborhoodVibe": null,
          "weekendLifestyle": null
        },
        "neighbourhood": [
          "great-schools",
          "walkable-lively"
        ],
        "vibe": {
          "tags": [],
          "urbanToQuiet": 50,
          "moveInToProject": 50
        },
        "tasteReactions": [],
        "includeComingSoon": true,
        "onMarketSince": null,
        "options": {
          "shortlist": 4,
          "grade": 25,
          "photos": 8
        }
      },
      "createdAt": "2026-10-02T14:03:11.402Z",
      "updatedAt": "2026-10-02T14:03:11.402Z",
      "latestExecution": {
        "id": "0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83",
        "searchId": "6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
        "status": "succeeded",
        "step": "compliance",
        "stepLabel": "Checking fair housing",
        "attempts": 1,
        "progress": {
          "done": 9,
          "total": 9,
          "percent": 100
        },
        "createdAt": "2026-10-02T14:03:12.118Z",
        "startedAt": "2026-10-02T14:03:13.004Z",
        "finishedAt": "2026-10-02T14:05:47.930Z",
        "heartbeatAt": "2026-10-02T14:04:00.000Z",
        "links": {
          "self": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions/0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83",
          "search": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
          "cancel": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions/0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83/cancel"
        }
      },
      "links": {
        "self": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
        "run": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
        "executions": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions"
      }
    }
  ],
  "links": {
    "next": null
  }
}
Fields (120)
FieldTypeDescription
dataobject[]
data[].idstring (uuid)
data[].labelstring | null
data[].clientIdstring (uuid) | null
data[].revisionintegerCounts up on every save. The same number is the ETag.at least 1
data[].requestobjectThe request as saved, every default filled in.
data[].request.version1default 1
data[].request.clientIdstring (uuid) | nulldefault null
data[].request.labelstring | null1 to 120 characters, default null
data[].request.listingType"buy" | "rent"default "buy"
data[].request.locationobject
data[].request.location.labelstring1 to 120 characters
data[].request.location.centerobject, optional
data[].request.location.center.latnumber-90 to 90
data[].request.location.center.lngnumber-180 to 180
data[].request.priceobject
data[].request.price.minnumber, optional0 to 100000000
data[].request.price.maxnumber0 to 100000000
data[].request.price.budgetnumber, optional0 to 100000000
data[].request.bedsobject
data[].request.beds.mininteger0 to 20
data[].request.beds.targetinteger, optional0 to 20
data[].request.bathsobject
data[].request.baths.minnumber0 to 20
data[].request.baths.targetnumber, optional0 to 20
data[].request.sqftobject, optional
data[].request.sqft.minnumber, optional0 to 100000
data[].request.sqft.maxnumber, optional0 to 100000
data[].request.propertyTypes("single-family" | "condo" | "townhome" | "multi-family" | "manufactured" | "land")[]at most 6 items, default []
data[].request.commutesobject[]at most 3 items, default []
data[].request.commutes[].labelstring1 to 80 characters
data[].request.commutes[].latnumber, optional-90 to 90
data[].request.commutes[].lngnumber, optional-180 to 180
data[].request.commutes[].maxMinutesinteger0 to 120
data[].request.commutes[].anyOfstring, optional1 to 80 characters
data[].request.pinsobject[], optionalat most 4 items
data[].request.pins[].idstring1 to 64 characters
data[].request.pins[].latnumber-90 to 90
data[].request.pins[].lngnumber-180 to 180
data[].request.areasobject[]at most 10 items, default []
data[].request.areas[].namestring1 to 80 characters
data[].request.areas[].latnumber-90 to 90
data[].request.areas[].lngnumber-180 to 180
data[].request.areas[].weightinteger1 to 10, default 5
data[].request.areas[].kind"city" | "neighborhood", optional
data[].request.areas[].radiusMilesnumber, optional0.25 to 25
data[].request.mustHavesstring[]at most 20 items, default []
data[].request.niceToHavesstring[]at most 20 items, default []
data[].request.dealBreakersstring[]at most 20 items, default []
data[].request.idealHomestring | nullat most 4000 characters, default null
data[].request.idealHomeImportance"nice" | "must", optional
data[].request.dislikesstring | nullat most 2000 characters, default null
data[].request.movingReasonstring | nullat most 500 characters, default null
data[].request.lifestyleobjectdefault {"household":null,"hasKids":null,"kidsAges":null,"schoolPriority":null,"workFromHome":null,"wfhDaysPerWeek":null,"noiseSensitive":null,"yardImportance":null,"hasPets":null,"petType":null,"renovationTolerance":null,"hoaPreference":null,"neighborhoodVibe":null,"weekendLifestyle":null}
data[].request.lifestyle.householdstring | nullat most 120 characters, default null
data[].request.lifestyle.hasKidsboolean | nulldefault null
data[].request.lifestyle.kidsAgesstring | nullat most 60 characters, default null
data[].request.lifestyle.schoolPriority"critical" | "important" | "nice" | "none" | nulldefault null
data[].request.lifestyle.workFromHomeboolean | nulldefault null
data[].request.lifestyle.wfhDaysPerWeeknumber | null0 to 7, default null
data[].request.lifestyle.noiseSensitiveboolean | nulldefault null
data[].request.lifestyle.yardImportance"critical" | "important" | "nice" | "none" | nulldefault null
data[].request.lifestyle.hasPetsboolean | nulldefault null
data[].request.lifestyle.petTypestring | nullat most 60 characters, default null
data[].request.lifestyle.renovationTolerance"none" | "minor" | "major" | nulldefault null
data[].request.lifestyle.hoaPreference"avoid" | "ok" | "prefer" | nulldefault null
data[].request.lifestyle.neighborhoodVibestring | nullat most 200 characters, default null
data[].request.lifestyle.weekendLifestylestring | nullat most 200 characters, default null
data[].request.neighbourhood("safe-low-crime" | "great-schools" | "walkable-lively" | "near-parks" | "quiet-residential" | "up-and-coming")[]at most 6 items, default []
data[].request.vibeobjectdefault {"tags":[],"urbanToQuiet":50,"moveInToProject":50}
data[].request.vibe.tagsstring[]at most 12 items, default []
data[].request.vibe.urbanToQuietinteger0 to 100, default 50
data[].request.vibe.moveInToProjectinteger0 to 100, default 50
data[].request.tasteReactionsobject[]at most 23 items, default []
data[].request.tasteReactions[].cardId"views-city" | "views-mountain" | "views-water" | "views-treetops" | "light-floor-ceiling" | "light-bright-airy" | "light-cozy" | "kitchen-gourmet" | "kitchen-family" | "kitchen-minimal" | "outdoor-pool" | "outdoor-garden" | "outdoor-balcony" | "outdoor-minimal" | "living-open" | "living-rooms" | "living-loft" | "office-dedicated" | "office-flex" | "office-none" | "cond-move-in" | "cond-updates" | "cond-project"
data[].request.tasteReactions[].reaction"love" | "pass"
data[].request.inspirationsobject[], optional1 to 4 items
data[].request.inspirations[].listingKeystring, optional1 to 100 characters
data[].request.inspirations[].addressstring, optional1 to 200 characters
data[].request.inspirations[].pricenumber, optional0 to 100000000
data[].request.inspirations[].bedsinteger, optional0 to 20
data[].request.inspirations[].bathsnumber, optional0 to 20
data[].request.inspirations[].sqftnumber, optional0 to 100000
data[].request.inspirations[].descriptionstring, optional1 to 300 characters
data[].request.inspirations[].styleSignalsstring[], optionalat most 10 items
data[].request.inspirationImportance"nice" | "must", optional
data[].request.callbackUrlstring, optional1 to 2000 characters
data[].request.includeComingSoonbooleandefault true
data[].request.onMarketSincestring (date) | nulldefault null
data[].request.optionsobjectdefault {"shortlist":4,"grade":25,"photos":8}
data[].request.options.shortlistinteger1 to 12, default 4
data[].request.options.gradeinteger1 to 40, default 25
data[].request.options.photosinteger0 to 8, default 8
data[].createdAtstring (date-time)
data[].updatedAtstring (date-time)
data[].latestExecutionobject | nullThe newest run, or null when the search was saved and never run.
data[].latestExecution.idstring (uuid)The run's id.
data[].latestExecution.searchIdstring (uuid)
data[].latestExecution.status"queued" | "running" | "succeeded" | "failed" | "canceled"queued and running are unfinished: keep polling. succeeded, failed and canceled are final.
data[].latestExecution.step"area" | "gather" | "weigh" | "score" | "enrich" | "inspire" | "grade" | "finalize" | "compliance" | nullThe play the run is on, or null before it starts and after it ends.
data[].latestExecution.stepLabelstring | nullThat play in words for a person.
data[].latestExecution.attemptsintegerHow many times a driver has claimed the run. More than one means it resumed after a crash or a deadline.
data[].latestExecution.progressobject
data[].latestExecution.progress.doneintegerPlays finished.
data[].latestExecution.progress.totalintegerPlays in a run.
data[].latestExecution.progress.percentintegerHow far along, 0 to 100. It moves inside a long play.0 to 100
data[].latestExecution.createdAtstring (date-time)
data[].latestExecution.startedAtstring (date-time) | null
data[].latestExecution.finishedAtstring (date-time) | null
data[].latestExecution.heartbeatAtstring (date-time) | nullWhen the engine last checked in. Null before a claim. A running run that goes quiet here has stalled.
data[].latestExecution.linksobjectWhere to read this run, its search, and where to POST to cancel it.
data[].latestExecution.links.selfstring
data[].latestExecution.links.searchstring
data[].latestExecution.links.cancelstring
data[].linksobject
data[].links.selfstring
data[].links.runstring
data[].links.executionsstring
linksobject
links.nextstring | nullThe URL of the next page, or null when this is the last. Follow it as given.

Errors

StatusCodeWhen
400invalid-cursorThe cursor is not one a page linked to.

Any call of this kind can also answer401 unauthenticated401 invalid-api-key403 insufficient-scope429 rate-limited429 monthly-cap-reached500 internal

GET/api/v1/search/{searchId}

One saved search and its newest run. The ETag is the search's revision; send it back as If-Match to change or delete the search without overwriting a change you have not seen.

An API key carrying the scope named here, or a signed-in session.

Scope
search:read
Key kinds
PersonalOrganization

Required and optional fields, allowed values and errors, as the page shows them.

Parameters

NameInTypeRequiredDescription
searchIdPathstring (uuid)RequiredThe saved search's id.

Examples

curl "https://liviamatch.com/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60" \
  -H "Authorization: Bearer $LIVIA_API_KEY"

Responses

200

The search.

HeadersETag

A search whose run finished
{
  "data": {
    "id": "6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
    "label": "Okafors, East Nashville",
    "clientId": null,
    "revision": 1,
    "request": {
      "version": 1,
      "clientId": null,
      "label": "Okafors, East Nashville",
      "listingType": "buy",
      "location": {
        "label": "Nashville, TN",
        "center": {
          "lat": 36.1627,
          "lng": -86.7816
        }
      },
      "price": {
        "min": 450000,
        "max": 750000
      },
      "beds": {
        "min": 3
      },
      "baths": {
        "min": 2
      },
      "sqft": {
        "min": 1800
      },
      "propertyTypes": [
        "single-family"
      ],
      "commutes": [
        {
          "label": "Vanderbilt University Medical Center",
          "lat": 36.1421,
          "lng": -86.8016,
          "maxMinutes": 25
        }
      ],
      "areas": [],
      "mustHaves": [
        "Fenced yard",
        "Walkable to coffee"
      ],
      "niceToHaves": [
        "Home office"
      ],
      "dealBreakers": [
        "Busy road"
      ],
      "idealHome": "A renovated bungalow with big windows and a porch, close to the park.",
      "dislikes": null,
      "movingReason": null,
      "lifestyle": {
        "household": null,
        "hasKids": null,
        "kidsAges": null,
        "schoolPriority": null,
        "workFromHome": null,
        "wfhDaysPerWeek": null,
        "noiseSensitive": null,
        "yardImportance": null,
        "hasPets": null,
        "petType": null,
        "renovationTolerance": null,
        "hoaPreference": null,
        "neighborhoodVibe": null,
        "weekendLifestyle": null
      },
      "neighbourhood": [
        "great-schools",
        "walkable-lively"
      ],
      "vibe": {
        "tags": [],
        "urbanToQuiet": 50,
        "moveInToProject": 50
      },
      "tasteReactions": [],
      "includeComingSoon": true,
      "onMarketSince": null,
      "options": {
        "shortlist": 4,
        "grade": 25,
        "photos": 8
      }
    },
    "createdAt": "2026-10-02T14:03:11.402Z",
    "updatedAt": "2026-10-02T14:03:11.402Z",
    "latestExecution": {
      "id": "0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83",
      "searchId": "6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
      "status": "succeeded",
      "step": "compliance",
      "stepLabel": "Checking fair housing",
      "attempts": 1,
      "progress": {
        "done": 9,
        "total": 9,
        "percent": 100
      },
      "createdAt": "2026-10-02T14:03:12.118Z",
      "startedAt": "2026-10-02T14:03:13.004Z",
      "finishedAt": "2026-10-02T14:05:47.930Z",
      "heartbeatAt": "2026-10-02T14:04:00.000Z",
      "links": {
        "self": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions/0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83",
        "search": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
        "cancel": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions/0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83/cancel"
      }
    },
    "links": {
      "self": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
      "run": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
      "executions": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions"
    }
  }
}
Fields (118)
FieldTypeDescription
dataobject
data.idstring (uuid)
data.labelstring | null
data.clientIdstring (uuid) | null
data.revisionintegerCounts up on every save. The same number is the ETag.at least 1
data.requestobjectThe request as saved, every default filled in.
data.request.version1default 1
data.request.clientIdstring (uuid) | nulldefault null
data.request.labelstring | null1 to 120 characters, default null
data.request.listingType"buy" | "rent"default "buy"
data.request.locationobject
data.request.location.labelstring1 to 120 characters
data.request.location.centerobject, optional
data.request.location.center.latnumber-90 to 90
data.request.location.center.lngnumber-180 to 180
data.request.priceobject
data.request.price.minnumber, optional0 to 100000000
data.request.price.maxnumber0 to 100000000
data.request.price.budgetnumber, optional0 to 100000000
data.request.bedsobject
data.request.beds.mininteger0 to 20
data.request.beds.targetinteger, optional0 to 20
data.request.bathsobject
data.request.baths.minnumber0 to 20
data.request.baths.targetnumber, optional0 to 20
data.request.sqftobject, optional
data.request.sqft.minnumber, optional0 to 100000
data.request.sqft.maxnumber, optional0 to 100000
data.request.propertyTypes("single-family" | "condo" | "townhome" | "multi-family" | "manufactured" | "land")[]at most 6 items, default []
data.request.commutesobject[]at most 3 items, default []
data.request.commutes[].labelstring1 to 80 characters
data.request.commutes[].latnumber, optional-90 to 90
data.request.commutes[].lngnumber, optional-180 to 180
data.request.commutes[].maxMinutesinteger0 to 120
data.request.commutes[].anyOfstring, optional1 to 80 characters
data.request.pinsobject[], optionalat most 4 items
data.request.pins[].idstring1 to 64 characters
data.request.pins[].latnumber-90 to 90
data.request.pins[].lngnumber-180 to 180
data.request.areasobject[]at most 10 items, default []
data.request.areas[].namestring1 to 80 characters
data.request.areas[].latnumber-90 to 90
data.request.areas[].lngnumber-180 to 180
data.request.areas[].weightinteger1 to 10, default 5
data.request.areas[].kind"city" | "neighborhood", optional
data.request.areas[].radiusMilesnumber, optional0.25 to 25
data.request.mustHavesstring[]at most 20 items, default []
data.request.niceToHavesstring[]at most 20 items, default []
data.request.dealBreakersstring[]at most 20 items, default []
data.request.idealHomestring | nullat most 4000 characters, default null
data.request.idealHomeImportance"nice" | "must", optional
data.request.dislikesstring | nullat most 2000 characters, default null
data.request.movingReasonstring | nullat most 500 characters, default null
data.request.lifestyleobjectdefault {"household":null,"hasKids":null,"kidsAges":null,"schoolPriority":null,"workFromHome":null,"wfhDaysPerWeek":null,"noiseSensitive":null,"yardImportance":null,"hasPets":null,"petType":null,"renovationTolerance":null,"hoaPreference":null,"neighborhoodVibe":null,"weekendLifestyle":null}
data.request.lifestyle.householdstring | nullat most 120 characters, default null
data.request.lifestyle.hasKidsboolean | nulldefault null
data.request.lifestyle.kidsAgesstring | nullat most 60 characters, default null
data.request.lifestyle.schoolPriority"critical" | "important" | "nice" | "none" | nulldefault null
data.request.lifestyle.workFromHomeboolean | nulldefault null
data.request.lifestyle.wfhDaysPerWeeknumber | null0 to 7, default null
data.request.lifestyle.noiseSensitiveboolean | nulldefault null
data.request.lifestyle.yardImportance"critical" | "important" | "nice" | "none" | nulldefault null
data.request.lifestyle.hasPetsboolean | nulldefault null
data.request.lifestyle.petTypestring | nullat most 60 characters, default null
data.request.lifestyle.renovationTolerance"none" | "minor" | "major" | nulldefault null
data.request.lifestyle.hoaPreference"avoid" | "ok" | "prefer" | nulldefault null
data.request.lifestyle.neighborhoodVibestring | nullat most 200 characters, default null
data.request.lifestyle.weekendLifestylestring | nullat most 200 characters, default null
data.request.neighbourhood("safe-low-crime" | "great-schools" | "walkable-lively" | "near-parks" | "quiet-residential" | "up-and-coming")[]at most 6 items, default []
data.request.vibeobjectdefault {"tags":[],"urbanToQuiet":50,"moveInToProject":50}
data.request.vibe.tagsstring[]at most 12 items, default []
data.request.vibe.urbanToQuietinteger0 to 100, default 50
data.request.vibe.moveInToProjectinteger0 to 100, default 50
data.request.tasteReactionsobject[]at most 23 items, default []
data.request.tasteReactions[].cardId"views-city" | "views-mountain" | "views-water" | "views-treetops" | "light-floor-ceiling" | "light-bright-airy" | "light-cozy" | "kitchen-gourmet" | "kitchen-family" | "kitchen-minimal" | "outdoor-pool" | "outdoor-garden" | "outdoor-balcony" | "outdoor-minimal" | "living-open" | "living-rooms" | "living-loft" | "office-dedicated" | "office-flex" | "office-none" | "cond-move-in" | "cond-updates" | "cond-project"
data.request.tasteReactions[].reaction"love" | "pass"
data.request.inspirationsobject[], optional1 to 4 items
data.request.inspirations[].listingKeystring, optional1 to 100 characters
data.request.inspirations[].addressstring, optional1 to 200 characters
data.request.inspirations[].pricenumber, optional0 to 100000000
data.request.inspirations[].bedsinteger, optional0 to 20
data.request.inspirations[].bathsnumber, optional0 to 20
data.request.inspirations[].sqftnumber, optional0 to 100000
data.request.inspirations[].descriptionstring, optional1 to 300 characters
data.request.inspirations[].styleSignalsstring[], optionalat most 10 items
data.request.inspirationImportance"nice" | "must", optional
data.request.callbackUrlstring, optional1 to 2000 characters
data.request.includeComingSoonbooleandefault true
data.request.onMarketSincestring (date) | nulldefault null
data.request.optionsobjectdefault {"shortlist":4,"grade":25,"photos":8}
data.request.options.shortlistinteger1 to 12, default 4
data.request.options.gradeinteger1 to 40, default 25
data.request.options.photosinteger0 to 8, default 8
data.createdAtstring (date-time)
data.updatedAtstring (date-time)
data.latestExecutionobject | nullThe newest run, or null when the search was saved and never run.
data.latestExecution.idstring (uuid)The run's id.
data.latestExecution.searchIdstring (uuid)
data.latestExecution.status"queued" | "running" | "succeeded" | "failed" | "canceled"queued and running are unfinished: keep polling. succeeded, failed and canceled are final.
data.latestExecution.step"area" | "gather" | "weigh" | "score" | "enrich" | "inspire" | "grade" | "finalize" | "compliance" | nullThe play the run is on, or null before it starts and after it ends.
data.latestExecution.stepLabelstring | nullThat play in words for a person.
data.latestExecution.attemptsintegerHow many times a driver has claimed the run. More than one means it resumed after a crash or a deadline.
data.latestExecution.progressobject
data.latestExecution.progress.doneintegerPlays finished.
data.latestExecution.progress.totalintegerPlays in a run.
data.latestExecution.progress.percentintegerHow far along, 0 to 100. It moves inside a long play.0 to 100
data.latestExecution.createdAtstring (date-time)
data.latestExecution.startedAtstring (date-time) | null
data.latestExecution.finishedAtstring (date-time) | null
data.latestExecution.heartbeatAtstring (date-time) | nullWhen the engine last checked in. Null before a claim. A running run that goes quiet here has stalled.
data.latestExecution.linksobjectWhere to read this run, its search, and where to POST to cancel it.
data.latestExecution.links.selfstring
data.latestExecution.links.searchstring
data.latestExecution.links.cancelstring
data.linksobject
data.links.selfstring
data.links.runstring
data.links.executionsstring

Errors

StatusCodeWhen
404not-foundNo such search in your workspace.

Any call of this kind can also answer401 unauthenticated401 invalid-api-key403 insufficient-scope429 rate-limited429 monthly-cap-reached500 internal

PUT/api/v1/search/{searchId}

Saves a request at an id you choose, without running it. 201 when the id is new, 200 when it replaced one of yours. Choosing the id makes a retried save land once.

Replacing a search keeps its runs. Send If-Match with the ETag you last read to be sure you are not overwriting someone else's change; a stale revision is 412 and nothing is written.

An API key carrying the scope named here, or a signed-in session.

Scope
search:run
Key kinds
PersonalOrganization

Required and optional fields, allowed values and errors, as the page shows them.

Parameters

NameInTypeRequiredDescription
searchIdPathstring (uuid)RequiredThe saved search's id.
If-MatchHeaderstringOptionalThe ETag of the version you read, such as "3". If the search has changed since, nothing is written and the answer is 412.

Request body

The whole request, as for starting a search.

Fields (87)
FieldTypeRequiredDescription
version1Optionaldefault 1
clientIdstring (uuid) | nullOptionaldefault null
labelstring | nullOptional1 to 120 characters, default null
listingType"buy" | "rent"Optionaldefault "buy"
locationobjectRequired
location.labelstringRequired1 to 120 characters
location.centerobjectOptional
location.center.latnumberRequired-90 to 90
location.center.lngnumberRequired-180 to 180
priceobjectRequired
price.minnumberOptional0 to 100000000
price.maxnumberRequired0 to 100000000
price.budgetnumberOptional0 to 100000000
bedsobjectRequired
beds.minintegerRequired0 to 20
beds.targetintegerOptional0 to 20
bathsobjectRequired
baths.minnumberRequired0 to 20
baths.targetnumberOptional0 to 20
sqftobjectOptional
sqft.minnumberOptional0 to 100000
sqft.maxnumberOptional0 to 100000
propertyTypes("single-family" | "condo" | "townhome" | "multi-family" | "manufactured" | "land")[]Optionalat most 6 items, default []
commutesobject[]Optionalat most 3 items, default []
commutes[].labelstringRequired1 to 80 characters
commutes[].latnumberOptional-90 to 90
commutes[].lngnumberOptional-180 to 180
commutes[].maxMinutesintegerRequired0 to 120
commutes[].anyOfstringOptional1 to 80 characters
pinsobject[]Optionalat most 4 items
pins[].idstringRequired1 to 64 characters
pins[].latnumberRequired-90 to 90
pins[].lngnumberRequired-180 to 180
areasobject[]Optionalat most 10 items, default []
areas[].namestringRequired1 to 80 characters
areas[].latnumberRequired-90 to 90
areas[].lngnumberRequired-180 to 180
areas[].weightintegerOptional1 to 10, default 5
areas[].kind"city" | "neighborhood"Optional
areas[].radiusMilesnumberOptional0.25 to 25
mustHavesstring[]Optionalat most 20 items, default []
niceToHavesstring[]Optionalat most 20 items, default []
dealBreakersstring[]Optionalat most 20 items, default []
idealHomestring | nullOptionalat most 4000 characters, default null
idealHomeImportance"nice" | "must"Optional
dislikesstring | nullOptionalat most 2000 characters, default null
movingReasonstring | nullOptionalat most 500 characters, default null
lifestyleobjectOptionaldefault {"household":null,"hasKids":null,"kidsAges":null,"schoolPriority":null,"workFromHome":null,"wfhDaysPerWeek":null,"noiseSensitive":null,"yardImportance":null,"hasPets":null,"petType":null,"renovationTolerance":null,"hoaPreference":null,"neighborhoodVibe":null,"weekendLifestyle":null}
lifestyle.householdstring | nullOptionalat most 120 characters, default null
lifestyle.hasKidsboolean | nullOptionaldefault null
lifestyle.kidsAgesstring | nullOptionalat most 60 characters, default null
lifestyle.schoolPriority"critical" | "important" | "nice" | "none" | nullOptionaldefault null
lifestyle.workFromHomeboolean | nullOptionaldefault null
lifestyle.wfhDaysPerWeeknumber | nullOptional0 to 7, default null
lifestyle.noiseSensitiveboolean | nullOptionaldefault null
lifestyle.yardImportance"critical" | "important" | "nice" | "none" | nullOptionaldefault null
lifestyle.hasPetsboolean | nullOptionaldefault null
lifestyle.petTypestring | nullOptionalat most 60 characters, default null
lifestyle.renovationTolerance"none" | "minor" | "major" | nullOptionaldefault null
lifestyle.hoaPreference"avoid" | "ok" | "prefer" | nullOptionaldefault null
lifestyle.neighborhoodVibestring | nullOptionalat most 200 characters, default null
lifestyle.weekendLifestylestring | nullOptionalat most 200 characters, default null
neighbourhood("safe-low-crime" | "great-schools" | "walkable-lively" | "near-parks" | "quiet-residential" | "up-and-coming")[]Optionalat most 6 items, default []
vibeobjectOptionaldefault {"tags":[],"urbanToQuiet":50,"moveInToProject":50}
vibe.tagsstring[]Optionalat most 12 items, default []
vibe.urbanToQuietintegerOptional0 to 100, default 50
vibe.moveInToProjectintegerOptional0 to 100, default 50
tasteReactionsobject[]Optionalat most 23 items, default []
tasteReactions[].cardId"views-city" | "views-mountain" | "views-water" | "views-treetops" | "light-floor-ceiling" | "light-bright-airy" | "light-cozy" | "kitchen-gourmet" | "kitchen-family" | "kitchen-minimal" | "outdoor-pool" | "outdoor-garden" | "outdoor-balcony" | "outdoor-minimal" | "living-open" | "living-rooms" | "living-loft" | "office-dedicated" | "office-flex" | "office-none" | "cond-move-in" | "cond-updates" | "cond-project"Required
tasteReactions[].reaction"love" | "pass"Required
inspirationsobject[]Optional1 to 4 items
inspirations[].listingKeystringOptional1 to 100 characters
inspirations[].addressstringOptional1 to 200 characters
inspirations[].pricenumberOptional0 to 100000000
inspirations[].bedsintegerOptional0 to 20
inspirations[].bathsnumberOptional0 to 20
inspirations[].sqftnumberOptional0 to 100000
inspirations[].descriptionstringOptional1 to 300 characters
inspirations[].styleSignalsstring[]Optionalat most 10 items
inspirationImportance"nice" | "must"Optional
callbackUrlstringOptional1 to 2000 characters
includeComingSoonbooleanOptionaldefault true
onMarketSincestring (date) | nullOptionaldefault null
optionsobjectOptionaldefault {"shortlist":4,"grade":25,"photos":8}
options.shortlistintegerOptional1 to 12, default 4
options.gradeintegerOptional1 to 40, default 25
options.photosintegerOptional0 to 8, default 8
Examples
{
  "label": "Okafors, East Nashville",
  "listingType": "buy",
  "location": {
    "label": "Nashville, TN",
    "center": {
      "lat": 36.1627,
      "lng": -86.7816
    }
  },
  "price": {
    "min": 450000,
    "max": 750000
  },
  "beds": {
    "min": 3
  },
  "baths": {
    "min": 2
  },
  "sqft": {
    "min": 1800
  },
  "propertyTypes": [
    "single-family"
  ],
  "commutes": [
    {
      "label": "Vanderbilt University Medical Center",
      "lat": 36.1421,
      "lng": -86.8016,
      "maxMinutes": 25
    }
  ],
  "mustHaves": [
    "Fenced yard",
    "Walkable to coffee"
  ],
  "niceToHaves": [
    "Home office"
  ],
  "dealBreakers": [
    "Busy road"
  ],
  "idealHome": "A renovated bungalow with big windows and a porch, close to the park.",
  "neighbourhood": [
    "great-schools",
    "walkable-lively"
  ],
  "options": {
    "shortlist": 4
  }
}

Examples

curl -X PUT "https://liviamatch.com/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60" \
  -H "Authorization: Bearer $LIVIA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "label": "Okafors, East Nashville",
  "listingType": "buy",
  "location": {
    "label": "Nashville, TN",
    "center": {
      "lat": 36.1627,
      "lng": -86.7816
    }
  },
  "price": {
    "min": 450000,
    "max": 750000
  },
  "beds": {
    "min": 3
  },
  "baths": {
    "min": 2
  },
  "sqft": {
    "min": 1800
  },
  "propertyTypes": [
    "single-family"
  ],
  "commutes": [
    {
      "label": "Vanderbilt University Medical Center",
      "lat": 36.1421,
      "lng": -86.8016,
      "maxMinutes": 25
    }
  ],
  "mustHaves": [
    "Fenced yard",
    "Walkable to coffee"
  ],
  "niceToHaves": [
    "Home office"
  ],
  "dealBreakers": [
    "Busy road"
  ],
  "idealHome": "A renovated bungalow with big windows and a porch, close to the park.",
  "neighbourhood": [
    "great-schools",
    "walkable-lively"
  ],
  "options": {
    "shortlist": 4
  }
}'

Responses

201

A new search was saved.

HeadersETagLocation

A new search
{
  "data": {
    "id": "6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
    "label": "Okafors, East Nashville",
    "clientId": null,
    "revision": 1,
    "request": {
      "version": 1,
      "clientId": null,
      "label": "Okafors, East Nashville",
      "listingType": "buy",
      "location": {
        "label": "Nashville, TN",
        "center": {
          "lat": 36.1627,
          "lng": -86.7816
        }
      },
      "price": {
        "min": 450000,
        "max": 750000
      },
      "beds": {
        "min": 3
      },
      "baths": {
        "min": 2
      },
      "sqft": {
        "min": 1800
      },
      "propertyTypes": [
        "single-family"
      ],
      "commutes": [
        {
          "label": "Vanderbilt University Medical Center",
          "lat": 36.1421,
          "lng": -86.8016,
          "maxMinutes": 25
        }
      ],
      "areas": [],
      "mustHaves": [
        "Fenced yard",
        "Walkable to coffee"
      ],
      "niceToHaves": [
        "Home office"
      ],
      "dealBreakers": [
        "Busy road"
      ],
      "idealHome": "A renovated bungalow with big windows and a porch, close to the park.",
      "dislikes": null,
      "movingReason": null,
      "lifestyle": {
        "household": null,
        "hasKids": null,
        "kidsAges": null,
        "schoolPriority": null,
        "workFromHome": null,
        "wfhDaysPerWeek": null,
        "noiseSensitive": null,
        "yardImportance": null,
        "hasPets": null,
        "petType": null,
        "renovationTolerance": null,
        "hoaPreference": null,
        "neighborhoodVibe": null,
        "weekendLifestyle": null
      },
      "neighbourhood": [
        "great-schools",
        "walkable-lively"
      ],
      "vibe": {
        "tags": [],
        "urbanToQuiet": 50,
        "moveInToProject": 50
      },
      "tasteReactions": [],
      "includeComingSoon": true,
      "onMarketSince": null,
      "options": {
        "shortlist": 4,
        "grade": 25,
        "photos": 8
      }
    },
    "createdAt": "2026-10-02T14:03:11.402Z",
    "updatedAt": "2026-10-02T14:03:11.402Z",
    "latestExecution": null,
    "links": {
      "self": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
      "run": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
      "executions": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions"
    }
  }
}
Fields (118)
FieldTypeDescription
dataobject
data.idstring (uuid)
data.labelstring | null
data.clientIdstring (uuid) | null
data.revisionintegerCounts up on every save. The same number is the ETag.at least 1
data.requestobjectThe request as saved, every default filled in.
data.request.version1default 1
data.request.clientIdstring (uuid) | nulldefault null
data.request.labelstring | null1 to 120 characters, default null
data.request.listingType"buy" | "rent"default "buy"
data.request.locationobject
data.request.location.labelstring1 to 120 characters
data.request.location.centerobject, optional
data.request.location.center.latnumber-90 to 90
data.request.location.center.lngnumber-180 to 180
data.request.priceobject
data.request.price.minnumber, optional0 to 100000000
data.request.price.maxnumber0 to 100000000
data.request.price.budgetnumber, optional0 to 100000000
data.request.bedsobject
data.request.beds.mininteger0 to 20
data.request.beds.targetinteger, optional0 to 20
data.request.bathsobject
data.request.baths.minnumber0 to 20
data.request.baths.targetnumber, optional0 to 20
data.request.sqftobject, optional
data.request.sqft.minnumber, optional0 to 100000
data.request.sqft.maxnumber, optional0 to 100000
data.request.propertyTypes("single-family" | "condo" | "townhome" | "multi-family" | "manufactured" | "land")[]at most 6 items, default []
data.request.commutesobject[]at most 3 items, default []
data.request.commutes[].labelstring1 to 80 characters
data.request.commutes[].latnumber, optional-90 to 90
data.request.commutes[].lngnumber, optional-180 to 180
data.request.commutes[].maxMinutesinteger0 to 120
data.request.commutes[].anyOfstring, optional1 to 80 characters
data.request.pinsobject[], optionalat most 4 items
data.request.pins[].idstring1 to 64 characters
data.request.pins[].latnumber-90 to 90
data.request.pins[].lngnumber-180 to 180
data.request.areasobject[]at most 10 items, default []
data.request.areas[].namestring1 to 80 characters
data.request.areas[].latnumber-90 to 90
data.request.areas[].lngnumber-180 to 180
data.request.areas[].weightinteger1 to 10, default 5
data.request.areas[].kind"city" | "neighborhood", optional
data.request.areas[].radiusMilesnumber, optional0.25 to 25
data.request.mustHavesstring[]at most 20 items, default []
data.request.niceToHavesstring[]at most 20 items, default []
data.request.dealBreakersstring[]at most 20 items, default []
data.request.idealHomestring | nullat most 4000 characters, default null
data.request.idealHomeImportance"nice" | "must", optional
data.request.dislikesstring | nullat most 2000 characters, default null
data.request.movingReasonstring | nullat most 500 characters, default null
data.request.lifestyleobjectdefault {"household":null,"hasKids":null,"kidsAges":null,"schoolPriority":null,"workFromHome":null,"wfhDaysPerWeek":null,"noiseSensitive":null,"yardImportance":null,"hasPets":null,"petType":null,"renovationTolerance":null,"hoaPreference":null,"neighborhoodVibe":null,"weekendLifestyle":null}
data.request.lifestyle.householdstring | nullat most 120 characters, default null
data.request.lifestyle.hasKidsboolean | nulldefault null
data.request.lifestyle.kidsAgesstring | nullat most 60 characters, default null
data.request.lifestyle.schoolPriority"critical" | "important" | "nice" | "none" | nulldefault null
data.request.lifestyle.workFromHomeboolean | nulldefault null
data.request.lifestyle.wfhDaysPerWeeknumber | null0 to 7, default null
data.request.lifestyle.noiseSensitiveboolean | nulldefault null
data.request.lifestyle.yardImportance"critical" | "important" | "nice" | "none" | nulldefault null
data.request.lifestyle.hasPetsboolean | nulldefault null
data.request.lifestyle.petTypestring | nullat most 60 characters, default null
data.request.lifestyle.renovationTolerance"none" | "minor" | "major" | nulldefault null
data.request.lifestyle.hoaPreference"avoid" | "ok" | "prefer" | nulldefault null
data.request.lifestyle.neighborhoodVibestring | nullat most 200 characters, default null
data.request.lifestyle.weekendLifestylestring | nullat most 200 characters, default null
data.request.neighbourhood("safe-low-crime" | "great-schools" | "walkable-lively" | "near-parks" | "quiet-residential" | "up-and-coming")[]at most 6 items, default []
data.request.vibeobjectdefault {"tags":[],"urbanToQuiet":50,"moveInToProject":50}
data.request.vibe.tagsstring[]at most 12 items, default []
data.request.vibe.urbanToQuietinteger0 to 100, default 50
data.request.vibe.moveInToProjectinteger0 to 100, default 50
data.request.tasteReactionsobject[]at most 23 items, default []
data.request.tasteReactions[].cardId"views-city" | "views-mountain" | "views-water" | "views-treetops" | "light-floor-ceiling" | "light-bright-airy" | "light-cozy" | "kitchen-gourmet" | "kitchen-family" | "kitchen-minimal" | "outdoor-pool" | "outdoor-garden" | "outdoor-balcony" | "outdoor-minimal" | "living-open" | "living-rooms" | "living-loft" | "office-dedicated" | "office-flex" | "office-none" | "cond-move-in" | "cond-updates" | "cond-project"
data.request.tasteReactions[].reaction"love" | "pass"
data.request.inspirationsobject[], optional1 to 4 items
data.request.inspirations[].listingKeystring, optional1 to 100 characters
data.request.inspirations[].addressstring, optional1 to 200 characters
data.request.inspirations[].pricenumber, optional0 to 100000000
data.request.inspirations[].bedsinteger, optional0 to 20
data.request.inspirations[].bathsnumber, optional0 to 20
data.request.inspirations[].sqftnumber, optional0 to 100000
data.request.inspirations[].descriptionstring, optional1 to 300 characters
data.request.inspirations[].styleSignalsstring[], optionalat most 10 items
data.request.inspirationImportance"nice" | "must", optional
data.request.callbackUrlstring, optional1 to 2000 characters
data.request.includeComingSoonbooleandefault true
data.request.onMarketSincestring (date) | nulldefault null
data.request.optionsobjectdefault {"shortlist":4,"grade":25,"photos":8}
data.request.options.shortlistinteger1 to 12, default 4
data.request.options.gradeinteger1 to 40, default 25
data.request.options.photosinteger0 to 8, default 8
data.createdAtstring (date-time)
data.updatedAtstring (date-time)
data.latestExecutionobject | nullThe newest run, or null when the search was saved and never run.
data.latestExecution.idstring (uuid)The run's id.
data.latestExecution.searchIdstring (uuid)
data.latestExecution.status"queued" | "running" | "succeeded" | "failed" | "canceled"queued and running are unfinished: keep polling. succeeded, failed and canceled are final.
data.latestExecution.step"area" | "gather" | "weigh" | "score" | "enrich" | "inspire" | "grade" | "finalize" | "compliance" | nullThe play the run is on, or null before it starts and after it ends.
data.latestExecution.stepLabelstring | nullThat play in words for a person.
data.latestExecution.attemptsintegerHow many times a driver has claimed the run. More than one means it resumed after a crash or a deadline.
data.latestExecution.progressobject
data.latestExecution.progress.doneintegerPlays finished.
data.latestExecution.progress.totalintegerPlays in a run.
data.latestExecution.progress.percentintegerHow far along, 0 to 100. It moves inside a long play.0 to 100
data.latestExecution.createdAtstring (date-time)
data.latestExecution.startedAtstring (date-time) | null
data.latestExecution.finishedAtstring (date-time) | null
data.latestExecution.heartbeatAtstring (date-time) | nullWhen the engine last checked in. Null before a claim. A running run that goes quiet here has stalled.
data.latestExecution.linksobjectWhere to read this run, its search, and where to POST to cancel it.
data.latestExecution.links.selfstring
data.latestExecution.links.searchstring
data.latestExecution.links.cancelstring
data.linksobject
data.links.selfstring
data.links.runstring
data.links.executionsstring
200

An existing search was replaced.

HeadersETagLocation

A replaced search
{
  "data": {
    "id": "6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
    "label": "Okafors, East Nashville",
    "clientId": null,
    "revision": 2,
    "request": {
      "version": 1,
      "clientId": null,
      "label": "Okafors, East Nashville",
      "listingType": "buy",
      "location": {
        "label": "Nashville, TN",
        "center": {
          "lat": 36.1627,
          "lng": -86.7816
        }
      },
      "price": {
        "min": 450000,
        "max": 750000
      },
      "beds": {
        "min": 3
      },
      "baths": {
        "min": 2
      },
      "sqft": {
        "min": 1800
      },
      "propertyTypes": [
        "single-family"
      ],
      "commutes": [
        {
          "label": "Vanderbilt University Medical Center",
          "lat": 36.1421,
          "lng": -86.8016,
          "maxMinutes": 25
        }
      ],
      "areas": [],
      "mustHaves": [
        "Fenced yard",
        "Walkable to coffee"
      ],
      "niceToHaves": [
        "Home office"
      ],
      "dealBreakers": [
        "Busy road"
      ],
      "idealHome": "A renovated bungalow with big windows and a porch, close to the park.",
      "dislikes": null,
      "movingReason": null,
      "lifestyle": {
        "household": null,
        "hasKids": null,
        "kidsAges": null,
        "schoolPriority": null,
        "workFromHome": null,
        "wfhDaysPerWeek": null,
        "noiseSensitive": null,
        "yardImportance": null,
        "hasPets": null,
        "petType": null,
        "renovationTolerance": null,
        "hoaPreference": null,
        "neighborhoodVibe": null,
        "weekendLifestyle": null
      },
      "neighbourhood": [
        "great-schools",
        "walkable-lively"
      ],
      "vibe": {
        "tags": [],
        "urbanToQuiet": 50,
        "moveInToProject": 50
      },
      "tasteReactions": [],
      "includeComingSoon": true,
      "onMarketSince": null,
      "options": {
        "shortlist": 4,
        "grade": 25,
        "photos": 8
      }
    },
    "createdAt": "2026-10-02T14:03:11.402Z",
    "updatedAt": "2026-10-02T14:03:11.402Z",
    "latestExecution": {
      "id": "0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83",
      "searchId": "6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
      "status": "succeeded",
      "step": "compliance",
      "stepLabel": "Checking fair housing",
      "attempts": 1,
      "progress": {
        "done": 9,
        "total": 9,
        "percent": 100
      },
      "createdAt": "2026-10-02T14:03:12.118Z",
      "startedAt": "2026-10-02T14:03:13.004Z",
      "finishedAt": "2026-10-02T14:05:47.930Z",
      "heartbeatAt": "2026-10-02T14:04:00.000Z",
      "links": {
        "self": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions/0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83",
        "search": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
        "cancel": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions/0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83/cancel"
      }
    },
    "links": {
      "self": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
      "run": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
      "executions": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions"
    }
  }
}
Fields (118)
FieldTypeDescription
dataobject
data.idstring (uuid)
data.labelstring | null
data.clientIdstring (uuid) | null
data.revisionintegerCounts up on every save. The same number is the ETag.at least 1
data.requestobjectThe request as saved, every default filled in.
data.request.version1default 1
data.request.clientIdstring (uuid) | nulldefault null
data.request.labelstring | null1 to 120 characters, default null
data.request.listingType"buy" | "rent"default "buy"
data.request.locationobject
data.request.location.labelstring1 to 120 characters
data.request.location.centerobject, optional
data.request.location.center.latnumber-90 to 90
data.request.location.center.lngnumber-180 to 180
data.request.priceobject
data.request.price.minnumber, optional0 to 100000000
data.request.price.maxnumber0 to 100000000
data.request.price.budgetnumber, optional0 to 100000000
data.request.bedsobject
data.request.beds.mininteger0 to 20
data.request.beds.targetinteger, optional0 to 20
data.request.bathsobject
data.request.baths.minnumber0 to 20
data.request.baths.targetnumber, optional0 to 20
data.request.sqftobject, optional
data.request.sqft.minnumber, optional0 to 100000
data.request.sqft.maxnumber, optional0 to 100000
data.request.propertyTypes("single-family" | "condo" | "townhome" | "multi-family" | "manufactured" | "land")[]at most 6 items, default []
data.request.commutesobject[]at most 3 items, default []
data.request.commutes[].labelstring1 to 80 characters
data.request.commutes[].latnumber, optional-90 to 90
data.request.commutes[].lngnumber, optional-180 to 180
data.request.commutes[].maxMinutesinteger0 to 120
data.request.commutes[].anyOfstring, optional1 to 80 characters
data.request.pinsobject[], optionalat most 4 items
data.request.pins[].idstring1 to 64 characters
data.request.pins[].latnumber-90 to 90
data.request.pins[].lngnumber-180 to 180
data.request.areasobject[]at most 10 items, default []
data.request.areas[].namestring1 to 80 characters
data.request.areas[].latnumber-90 to 90
data.request.areas[].lngnumber-180 to 180
data.request.areas[].weightinteger1 to 10, default 5
data.request.areas[].kind"city" | "neighborhood", optional
data.request.areas[].radiusMilesnumber, optional0.25 to 25
data.request.mustHavesstring[]at most 20 items, default []
data.request.niceToHavesstring[]at most 20 items, default []
data.request.dealBreakersstring[]at most 20 items, default []
data.request.idealHomestring | nullat most 4000 characters, default null
data.request.idealHomeImportance"nice" | "must", optional
data.request.dislikesstring | nullat most 2000 characters, default null
data.request.movingReasonstring | nullat most 500 characters, default null
data.request.lifestyleobjectdefault {"household":null,"hasKids":null,"kidsAges":null,"schoolPriority":null,"workFromHome":null,"wfhDaysPerWeek":null,"noiseSensitive":null,"yardImportance":null,"hasPets":null,"petType":null,"renovationTolerance":null,"hoaPreference":null,"neighborhoodVibe":null,"weekendLifestyle":null}
data.request.lifestyle.householdstring | nullat most 120 characters, default null
data.request.lifestyle.hasKidsboolean | nulldefault null
data.request.lifestyle.kidsAgesstring | nullat most 60 characters, default null
data.request.lifestyle.schoolPriority"critical" | "important" | "nice" | "none" | nulldefault null
data.request.lifestyle.workFromHomeboolean | nulldefault null
data.request.lifestyle.wfhDaysPerWeeknumber | null0 to 7, default null
data.request.lifestyle.noiseSensitiveboolean | nulldefault null
data.request.lifestyle.yardImportance"critical" | "important" | "nice" | "none" | nulldefault null
data.request.lifestyle.hasPetsboolean | nulldefault null
data.request.lifestyle.petTypestring | nullat most 60 characters, default null
data.request.lifestyle.renovationTolerance"none" | "minor" | "major" | nulldefault null
data.request.lifestyle.hoaPreference"avoid" | "ok" | "prefer" | nulldefault null
data.request.lifestyle.neighborhoodVibestring | nullat most 200 characters, default null
data.request.lifestyle.weekendLifestylestring | nullat most 200 characters, default null
data.request.neighbourhood("safe-low-crime" | "great-schools" | "walkable-lively" | "near-parks" | "quiet-residential" | "up-and-coming")[]at most 6 items, default []
data.request.vibeobjectdefault {"tags":[],"urbanToQuiet":50,"moveInToProject":50}
data.request.vibe.tagsstring[]at most 12 items, default []
data.request.vibe.urbanToQuietinteger0 to 100, default 50
data.request.vibe.moveInToProjectinteger0 to 100, default 50
data.request.tasteReactionsobject[]at most 23 items, default []
data.request.tasteReactions[].cardId"views-city" | "views-mountain" | "views-water" | "views-treetops" | "light-floor-ceiling" | "light-bright-airy" | "light-cozy" | "kitchen-gourmet" | "kitchen-family" | "kitchen-minimal" | "outdoor-pool" | "outdoor-garden" | "outdoor-balcony" | "outdoor-minimal" | "living-open" | "living-rooms" | "living-loft" | "office-dedicated" | "office-flex" | "office-none" | "cond-move-in" | "cond-updates" | "cond-project"
data.request.tasteReactions[].reaction"love" | "pass"
data.request.inspirationsobject[], optional1 to 4 items
data.request.inspirations[].listingKeystring, optional1 to 100 characters
data.request.inspirations[].addressstring, optional1 to 200 characters
data.request.inspirations[].pricenumber, optional0 to 100000000
data.request.inspirations[].bedsinteger, optional0 to 20
data.request.inspirations[].bathsnumber, optional0 to 20
data.request.inspirations[].sqftnumber, optional0 to 100000
data.request.inspirations[].descriptionstring, optional1 to 300 characters
data.request.inspirations[].styleSignalsstring[], optionalat most 10 items
data.request.inspirationImportance"nice" | "must", optional
data.request.callbackUrlstring, optional1 to 2000 characters
data.request.includeComingSoonbooleandefault true
data.request.onMarketSincestring (date) | nulldefault null
data.request.optionsobjectdefault {"shortlist":4,"grade":25,"photos":8}
data.request.options.shortlistinteger1 to 12, default 4
data.request.options.gradeinteger1 to 40, default 25
data.request.options.photosinteger0 to 8, default 8
data.createdAtstring (date-time)
data.updatedAtstring (date-time)
data.latestExecutionobject | nullThe newest run, or null when the search was saved and never run.
data.latestExecution.idstring (uuid)The run's id.
data.latestExecution.searchIdstring (uuid)
data.latestExecution.status"queued" | "running" | "succeeded" | "failed" | "canceled"queued and running are unfinished: keep polling. succeeded, failed and canceled are final.
data.latestExecution.step"area" | "gather" | "weigh" | "score" | "enrich" | "inspire" | "grade" | "finalize" | "compliance" | nullThe play the run is on, or null before it starts and after it ends.
data.latestExecution.stepLabelstring | nullThat play in words for a person.
data.latestExecution.attemptsintegerHow many times a driver has claimed the run. More than one means it resumed after a crash or a deadline.
data.latestExecution.progressobject
data.latestExecution.progress.doneintegerPlays finished.
data.latestExecution.progress.totalintegerPlays in a run.
data.latestExecution.progress.percentintegerHow far along, 0 to 100. It moves inside a long play.0 to 100
data.latestExecution.createdAtstring (date-time)
data.latestExecution.startedAtstring (date-time) | null
data.latestExecution.finishedAtstring (date-time) | null
data.latestExecution.heartbeatAtstring (date-time) | nullWhen the engine last checked in. Null before a claim. A running run that goes quiet here has stalled.
data.latestExecution.linksobjectWhere to read this run, its search, and where to POST to cancel it.
data.latestExecution.links.selfstring
data.latestExecution.links.searchstring
data.latestExecution.links.cancelstring
data.linksobject
data.links.selfstring
data.links.runstring
data.links.executionsstring

Errors

StatusCodeWhen
400invalidThe request failed validation; issues names each field.
400invalid-jsonThe body is empty or not JSON.
400invalid-if-matchThe If-Match is not a revision.
409id-unavailableThe id belongs to something that is not yours.
412revision-mismatchThe search changed since the revision in If-Match.
413too-largeThe body is over 64 KiB.
422unknown-clientclientId is not a client in the workspace.

Any call of this kind can also answer401 unauthenticated401 invalid-api-key403 insufficient-scope429 rate-limited429 monthly-cap-reached500 internal

POST/api/v1/search/{searchId}

Queues another run of a saved search and answers 202, exactly as starting one does. Use it to re-run a search as the market moves.

The body is optional. overrides replaces top-level keys of the saved request for this run only ({ "overrides": { "price": { "max": 700000 } } }), and the merged request is validated again, so an override can never produce a request the API would refuse. The saved search itself is not changed.

An API key carrying the scope named here, or a signed-in session.

Scope
search:run
Key kinds
PersonalOrganization

Required and optional fields, allowed values and errors, as the page shows them.

Parameters

NameInTypeRequiredDescription
searchIdPathstring (uuid)RequiredThe saved search's id.
Idempotency-KeyHeaderstringOptionalA value of your own for this attempt. The same key with the same request replays the first answer (Idempotent-Replayed: true) and starts nothing new; the same key with a different request is 409. A key is remembered for as long as its run exists.

Request body

Optional. Top-level keys of the request to replace for this run. The body is optional.

Fields (1)
FieldTypeRequiredDescription
overridesobjectOptionaldefault {}
Examples
{
  "overrides": {
    "price": {
      "min": 450000,
      "max": 700000
    }
  }
}

Examples

curl -X POST "https://liviamatch.com/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60" \
  -H "Authorization: Bearer $LIVIA_API_KEY" \
  -H "Idempotency-Key: okafor-east-nashville-1" \
  -H "Content-Type: application/json" \
  -d '{
  "overrides": {
    "price": {
      "min": 450000,
      "max": 700000
    }
  }
}'

Responses

202

A run was queued.

HeadersLocationRetry-AfterIdempotent-Replayed

A run, just queued
{
  "data": {
    "search": {
      "id": "6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
      "label": "Okafors, East Nashville",
      "clientId": null,
      "revision": 1,
      "request": {
        "version": 1,
        "clientId": null,
        "label": "Okafors, East Nashville",
        "listingType": "buy",
        "location": {
          "label": "Nashville, TN",
          "center": {
            "lat": 36.1627,
            "lng": -86.7816
          }
        },
        "price": {
          "min": 450000,
          "max": 750000
        },
        "beds": {
          "min": 3
        },
        "baths": {
          "min": 2
        },
        "sqft": {
          "min": 1800
        },
        "propertyTypes": [
          "single-family"
        ],
        "commutes": [
          {
            "label": "Vanderbilt University Medical Center",
            "lat": 36.1421,
            "lng": -86.8016,
            "maxMinutes": 25
          }
        ],
        "areas": [],
        "mustHaves": [
          "Fenced yard",
          "Walkable to coffee"
        ],
        "niceToHaves": [
          "Home office"
        ],
        "dealBreakers": [
          "Busy road"
        ],
        "idealHome": "A renovated bungalow with big windows and a porch, close to the park.",
        "dislikes": null,
        "movingReason": null,
        "lifestyle": {
          "household": null,
          "hasKids": null,
          "kidsAges": null,
          "schoolPriority": null,
          "workFromHome": null,
          "wfhDaysPerWeek": null,
          "noiseSensitive": null,
          "yardImportance": null,
          "hasPets": null,
          "petType": null,
          "renovationTolerance": null,
          "hoaPreference": null,
          "neighborhoodVibe": null,
          "weekendLifestyle": null
        },
        "neighbourhood": [
          "great-schools",
          "walkable-lively"
        ],
        "vibe": {
          "tags": [],
          "urbanToQuiet": 50,
          "moveInToProject": 50
        },
        "tasteReactions": [],
        "includeComingSoon": true,
        "onMarketSince": null,
        "options": {
          "shortlist": 4,
          "grade": 25,
          "photos": 8
        }
      },
      "createdAt": "2026-10-02T14:03:11.402Z",
      "updatedAt": "2026-10-02T14:03:11.402Z",
      "latestExecution": {
        "id": "0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83",
        "searchId": "6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
        "status": "queued",
        "step": null,
        "stepLabel": null,
        "attempts": 0,
        "progress": {
          "done": 0,
          "total": 9,
          "percent": 0
        },
        "createdAt": "2026-10-02T14:03:12.118Z",
        "startedAt": null,
        "finishedAt": null,
        "heartbeatAt": null,
        "links": {
          "self": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions/0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83",
          "search": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
          "cancel": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions/0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83/cancel"
        }
      },
      "links": {
        "self": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
        "run": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
        "executions": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions"
      }
    },
    "execution": {
      "id": "0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83",
      "searchId": "6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
      "status": "queued",
      "step": null,
      "stepLabel": null,
      "attempts": 0,
      "progress": {
        "done": 0,
        "total": 9,
        "percent": 0
      },
      "createdAt": "2026-10-02T14:03:12.118Z",
      "startedAt": null,
      "finishedAt": null,
      "heartbeatAt": null,
      "links": {
        "self": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions/0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83",
        "search": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
        "cancel": "/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60/executions/0d9e7c1a-52b8-4f3a-8e6d-1c7a9b2f4e83/cancel"
      }
    }
  }
}
Fields (138)
FieldTypeDescription
dataobject
data.searchobject
data.search.idstring (uuid)
data.search.labelstring | null
data.search.clientIdstring (uuid) | null
data.search.revisionintegerCounts up on every save. The same number is the ETag.at least 1
data.search.requestobjectThe request as saved, every default filled in.
data.search.request.version1default 1
data.search.request.clientIdstring (uuid) | nulldefault null
data.search.request.labelstring | null1 to 120 characters, default null
data.search.request.listingType"buy" | "rent"default "buy"
data.search.request.locationobject
data.search.request.location.labelstring1 to 120 characters
data.search.request.location.centerobject, optional
data.search.request.location.center.latnumber-90 to 90
data.search.request.location.center.lngnumber-180 to 180
data.search.request.priceobject
data.search.request.price.minnumber, optional0 to 100000000
data.search.request.price.maxnumber0 to 100000000
data.search.request.price.budgetnumber, optional0 to 100000000
data.search.request.bedsobject
data.search.request.beds.mininteger0 to 20
data.search.request.beds.targetinteger, optional0 to 20
data.search.request.bathsobject
data.search.request.baths.minnumber0 to 20
data.search.request.baths.targetnumber, optional0 to 20
data.search.request.sqftobject, optional
data.search.request.sqft.minnumber, optional0 to 100000
data.search.request.sqft.maxnumber, optional0 to 100000
data.search.request.propertyTypes("single-family" | "condo" | "townhome" | "multi-family" | "manufactured" | "land")[]at most 6 items, default []
data.search.request.commutesobject[]at most 3 items, default []
data.search.request.commutes[].labelstring1 to 80 characters
data.search.request.commutes[].latnumber, optional-90 to 90
data.search.request.commutes[].lngnumber, optional-180 to 180
data.search.request.commutes[].maxMinutesinteger0 to 120
data.search.request.commutes[].anyOfstring, optional1 to 80 characters
data.search.request.pinsobject[], optionalat most 4 items
data.search.request.pins[].idstring1 to 64 characters
data.search.request.pins[].latnumber-90 to 90
data.search.request.pins[].lngnumber-180 to 180
data.search.request.areasobject[]at most 10 items, default []
data.search.request.areas[].namestring1 to 80 characters
data.search.request.areas[].latnumber-90 to 90
data.search.request.areas[].lngnumber-180 to 180
data.search.request.areas[].weightinteger1 to 10, default 5
data.search.request.areas[].kind"city" | "neighborhood", optional
data.search.request.areas[].radiusMilesnumber, optional0.25 to 25
data.search.request.mustHavesstring[]at most 20 items, default []
data.search.request.niceToHavesstring[]at most 20 items, default []
data.search.request.dealBreakersstring[]at most 20 items, default []
data.search.request.idealHomestring | nullat most 4000 characters, default null
data.search.request.idealHomeImportance"nice" | "must", optional
data.search.request.dislikesstring | nullat most 2000 characters, default null
data.search.request.movingReasonstring | nullat most 500 characters, default null
data.search.request.lifestyleobjectdefault {"household":null,"hasKids":null,"kidsAges":null,"schoolPriority":null,"workFromHome":null,"wfhDaysPerWeek":null,"noiseSensitive":null,"yardImportance":null,"hasPets":null,"petType":null,"renovationTolerance":null,"hoaPreference":null,"neighborhoodVibe":null,"weekendLifestyle":null}
data.search.request.lifestyle.householdstring | nullat most 120 characters, default null
data.search.request.lifestyle.hasKidsboolean | nulldefault null
data.search.request.lifestyle.kidsAgesstring | nullat most 60 characters, default null
data.search.request.lifestyle.schoolPriority"critical" | "important" | "nice" | "none" | nulldefault null
data.search.request.lifestyle.workFromHomeboolean | nulldefault null
data.search.request.lifestyle.wfhDaysPerWeeknumber | null0 to 7, default null
data.search.request.lifestyle.noiseSensitiveboolean | nulldefault null
data.search.request.lifestyle.yardImportance"critical" | "important" | "nice" | "none" | nulldefault null
data.search.request.lifestyle.hasPetsboolean | nulldefault null
data.search.request.lifestyle.petTypestring | nullat most 60 characters, default null
data.search.request.lifestyle.renovationTolerance"none" | "minor" | "major" | nulldefault null
data.search.request.lifestyle.hoaPreference"avoid" | "ok" | "prefer" | nulldefault null
data.search.request.lifestyle.neighborhoodVibestring | nullat most 200 characters, default null
data.search.request.lifestyle.weekendLifestylestring | nullat most 200 characters, default null
data.search.request.neighbourhood("safe-low-crime" | "great-schools" | "walkable-lively" | "near-parks" | "quiet-residential" | "up-and-coming")[]at most 6 items, default []
data.search.request.vibeobjectdefault {"tags":[],"urbanToQuiet":50,"moveInToProject":50}
data.search.request.vibe.tagsstring[]at most 12 items, default []
data.search.request.vibe.urbanToQuietinteger0 to 100, default 50
data.search.request.vibe.moveInToProjectinteger0 to 100, default 50
data.search.request.tasteReactionsobject[]at most 23 items, default []
data.search.request.tasteReactions[].cardId"views-city" | "views-mountain" | "views-water" | "views-treetops" | "light-floor-ceiling" | "light-bright-airy" | "light-cozy" | "kitchen-gourmet" | "kitchen-family" | "kitchen-minimal" | "outdoor-pool" | "outdoor-garden" | "outdoor-balcony" | "outdoor-minimal" | "living-open" | "living-rooms" | "living-loft" | "office-dedicated" | "office-flex" | "office-none" | "cond-move-in" | "cond-updates" | "cond-project"
data.search.request.tasteReactions[].reaction"love" | "pass"
data.search.request.inspirationsobject[], optional1 to 4 items
data.search.request.inspirations[].listingKeystring, optional1 to 100 characters
data.search.request.inspirations[].addressstring, optional1 to 200 characters
data.search.request.inspirations[].pricenumber, optional0 to 100000000
data.search.request.inspirations[].bedsinteger, optional0 to 20
data.search.request.inspirations[].bathsnumber, optional0 to 20
data.search.request.inspirations[].sqftnumber, optional0 to 100000
data.search.request.inspirations[].descriptionstring, optional1 to 300 characters
data.search.request.inspirations[].styleSignalsstring[], optionalat most 10 items
data.search.request.inspirationImportance"nice" | "must", optional
data.search.request.callbackUrlstring, optional1 to 2000 characters
data.search.request.includeComingSoonbooleandefault true
data.search.request.onMarketSincestring (date) | nulldefault null
data.search.request.optionsobjectdefault {"shortlist":4,"grade":25,"photos":8}
data.search.request.options.shortlistinteger1 to 12, default 4
data.search.request.options.gradeinteger1 to 40, default 25
data.search.request.options.photosinteger0 to 8, default 8
data.search.createdAtstring (date-time)
data.search.updatedAtstring (date-time)
data.search.latestExecutionobject | nullThe newest run, or null when the search was saved and never run.
data.search.latestExecution.idstring (uuid)The run's id.
data.search.latestExecution.searchIdstring (uuid)
data.search.latestExecution.status"queued" | "running" | "succeeded" | "failed" | "canceled"queued and running are unfinished: keep polling. succeeded, failed and canceled are final.
data.search.latestExecution.step"area" | "gather" | "weigh" | "score" | "enrich" | "inspire" | "grade" | "finalize" | "compliance" | nullThe play the run is on, or null before it starts and after it ends.
data.search.latestExecution.stepLabelstring | nullThat play in words for a person.
data.search.latestExecution.attemptsintegerHow many times a driver has claimed the run. More than one means it resumed after a crash or a deadline.
data.search.latestExecution.progressobject
data.search.latestExecution.progress.doneintegerPlays finished.
data.search.latestExecution.progress.totalintegerPlays in a run.
data.search.latestExecution.progress.percentintegerHow far along, 0 to 100. It moves inside a long play.0 to 100
data.search.latestExecution.createdAtstring (date-time)
data.search.latestExecution.startedAtstring (date-time) | null
data.search.latestExecution.finishedAtstring (date-time) | null
data.search.latestExecution.heartbeatAtstring (date-time) | nullWhen the engine last checked in. Null before a claim. A running run that goes quiet here has stalled.
data.search.latestExecution.linksobjectWhere to read this run, its search, and where to POST to cancel it.
data.search.latestExecution.links.selfstring
data.search.latestExecution.links.searchstring
data.search.latestExecution.links.cancelstring
data.search.linksobject
data.search.links.selfstring
data.search.links.runstring
data.search.links.executionsstring
data.executionobject
data.execution.idstring (uuid)The run's id.
data.execution.searchIdstring (uuid)
data.execution.status"queued" | "running" | "succeeded" | "failed" | "canceled"queued and running are unfinished: keep polling. succeeded, failed and canceled are final.
data.execution.step"area" | "gather" | "weigh" | "score" | "enrich" | "inspire" | "grade" | "finalize" | "compliance" | nullThe play the run is on, or null before it starts and after it ends.
data.execution.stepLabelstring | nullThat play in words for a person.
data.execution.attemptsintegerHow many times a driver has claimed the run. More than one means it resumed after a crash or a deadline.
data.execution.progressobject
data.execution.progress.doneintegerPlays finished.
data.execution.progress.totalintegerPlays in a run.
data.execution.progress.percentintegerHow far along, 0 to 100. It moves inside a long play.0 to 100
data.execution.createdAtstring (date-time)
data.execution.startedAtstring (date-time) | null
data.execution.finishedAtstring (date-time) | null
data.execution.heartbeatAtstring (date-time) | nullWhen the engine last checked in. Null before a claim. A running run that goes quiet here has stalled.
data.execution.linksobjectWhere to read this run, its search, and where to POST to cancel it.
data.execution.links.selfstring
data.execution.links.searchstring
data.execution.links.cancelstring

Errors

StatusCodeWhen
404not-foundNo such search in your workspace.
400invalidThe request failed validation; issues names each field.
400invalid-jsonThe body is not JSON.
400invalid-idempotency-keyThe Idempotency-Key is malformed.
402out-of-creditsThe org has no matches left this month.
402person-limit-reachedThe person the key acts as has used their own monthly matches.
409idempotency-key-reusedThe Idempotency-Key was used for a different request.
413too-largeThe body is over 64 KiB.
422unknown-clientclientId is not a client in the workspace.
422callback-url-refusedThe callbackUrl is plain http to localhost on a deployment that is not development.
422callback-needs-keyThe run names a callbackUrl but was started without an API key.
422no-signing-secretThe run names a callbackUrl and the key has no signing secret.
429rate-limitedThe hourly cap on starting runs is spent (the answer has no RateLimit header).
429too-many-active3 runs are already queued or running.
503search-unavailableAn outside service the run needs is not configured here.
503studio-incompleteA prompt the match engine runs is incomplete in Livia's AI settings; issues names the step. Nothing was started or spent.

Any call of this kind can also answer401 unauthenticated401 invalid-api-key403 insufficient-scope429 monthly-cap-reached500 internal

DELETE/api/v1/search/{searchId}

Deletes a saved search with its runs, their steps and their pools. A run in flight loses its claim and stops at its next heartbeat. What the search spent stays on the usage ledger, so deleting never un-spends the month. This cannot be undone.

An API key carrying the scope named here, or a signed-in session.

Scope
search:run
Key kinds
PersonalOrganization

Required and optional fields, allowed values and errors, as the page shows them.

Parameters

NameInTypeRequiredDescription
searchIdPathstring (uuid)RequiredThe saved search's id.
If-MatchHeaderstringOptionalThe ETag of the version you read, such as "3". If the search has changed since, nothing is written and the answer is 412.

Examples

curl -X DELETE "https://liviamatch.com/api/v1/search/6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60" \
  -H "Authorization: Bearer $LIVIA_API_KEY"

Responses

200

The search is gone.

Deleted
{
  "data": {
    "id": "6f1c2b9e-0a45-4d7e-9a1c-3b2f8d4e5a60",
    "deleted": true
  }
}
Fields (3)
FieldTypeDescription
dataobject
data.idstring (uuid)
data.deletedtrue

Errors

StatusCodeWhen
404not-foundNo such search in your workspace.
400invalid-if-matchThe If-Match is not a revision.
412revision-mismatchThe search changed since the revision in If-Match; it was kept.

Any call of this kind can also answer401 unauthenticated401 invalid-api-key403 insufficient-scope429 rate-limited429 monthly-cap-reached500 internal