ScoredCallRequest
addressThe full street address of the property to score.
conditionThe property's condition, which sets the repair budget the derived numbers are built on. Optional: omit it and the property is priced as though it needs no repairs, which is exactly what turn_key does. It is a request option rather than a second property, so sending it never changes what the call costs.
tear_down is accepted by this schema and refused by the endpoint with a 400, before any Credits are consumed. That is deliberate rather than an oversight: the scoring service has no land-value estimate, so there is no honest way to price a tear-down here. Analyse lot value separately.
Repair figures are a screening range, not a contractor bid.
rehab_budgetYour own repair budget for this property, in whole dollars. Optional, and additive: an integration that does not send it is unaffected.
When you send it, the repaired value and the maximum allowable offer are built from your figure instead of the bracket condition maps to, and the rehab_budget in the response is the number the arithmetic actually used. Sending rehab_budget and condition together is legal — rehab_budget wins, every time — so you never have to choose the bracket that comes closest to a number you already know.
condition: tear_down is still refused with a 400 even when you send a repair budget. A repair budget does not answer what a tear-down needs, which is a land value, and there is no land-value estimate behind these numbers.
Repair figures are a screening range, not a contractor bid.
target_marginThe profit margin your buyer needs, as a fraction of the repaired value — 0.2 means twenty percent. Optional, and additive: an integration that does not send it is unaffected, and is priced at the default of 0.2.
When you send it, the maximum allowable offer is solved at your margin rather than the default one. The target_margin in the response is always the margin the answer was priced at, whether you sent one or not, so "what margin is this price built on?" is answerable on every response.
The target margin is a policy figure calibrated by judgment, not a parameter fitted to a data set — which is exactly why you can override it.
Price the property as you describe it, not as the county record has it. Optional, and additive: an integration that does not send it is unaffected and its answers do not move.
Send any of the six facts below and that value is used in place of the county record's, for the model, for the comparable-sales band and for the price derived from it. Every fact in subject_property.facts says where it came from, so a value you stated reads caller-stated and everything else reads county-record — a claim can never be mistaken for a record.
A value you supply reads caller-stated even when it matches the county's own figure. The label says where the number came from, not whether it changed.
Only these six facts, and nothing else. Any other key — including latitude, longitude, partial_bathrooms, address, or a misspelling of one of the six — is refused with a 400 before any Credit is spent, rather than being ignored. The coordinates are never overridable, and that is a rule rather than an omission: a what-if changes the house's facts, never which house.
Values must be usable, and an empty overrides is refused. A value must be the right JSON type, and must satisfy the rule stated on each fact below; null is refused, because an override may state a value but never erase one. overrides: {} is refused too — it declares a what-if while stating no claim, and its answer would be indistinguishable from a call that sent no overrides at all. Every one of these is a 400 before any Credit is spent.
The required facts are still required. If the property still lacks a fact the valuation needs after your values are applied, the call is refused and the Credit is refunded, exactly as an ordinary request would be. There is no "score it anyway". Your lot_size_square_feet or property_type can supply a fact the county record was missing, in which case the call scores and that fact reads caller-stated.
Overriding bathrooms does not change partial_bathrooms, which stays at the county's figure and is not overridable. This service does not add the two together, so do not read your stated bathroom count plus a county partial count as one total.
HistoryCallRequest
addressThe full street address of the property whose history you want.
property_id^[0-9a-f]{32}$A property identifier taken from a Scored Call answer — the subject's own, or any comparable property's. 32 lowercase hexadecimal characters. On this arm no address matching is performed: the record is looked up directly, and subject_property reads back exactly which record answered. Identifiers are looked up in the same identifier space the Scored Call publishes them in.
ScoredCallResponse
model_estimate_availableWhether the pricing model produced an estimate Investorlift Data Services was able to confirm for this property. Always present, alongside subject_property. When false, the model's estimate and its distribution are withheld from this response: they were checked against the comparable sales below and did not agree with them, and a confidently wrong valuation is worse than none. The Comp Band and the comparable sales are unaffected — they are derived from the sales themselves — and this call is charged as normal, because it still carries a valuation.
The property this answer is about, and the facts the valuation actually ran on. Always present on a scored answer, including one where the model's estimate was withheld. It is here so a mis-resolved address or a thin county record is visible before you act on the numbers: check that the address and the facts below describe the house you meant.
Every fact carries where it came from. county-record means the property data service's stored value for this property; caller-stated means a value you supplied in its place. Those are the only two values. A fact reads caller-stated when you supplied it through the overrides request option, and county-record otherwise — including partial_bathrooms, which cannot be overridden. A value you supply reads caller-stated even when it matches the county record's own figure.
A fact that is missing is missing on purpose. When the county record does not carry a usable value for something, that fact is left out of facts entirely rather than returned as null, 0 or an empty string. Absence is information: the valuation ran without it too. A recorded living area of zero is treated as no living area, not as a house that measures nothing.
This block is additive. It was added without changing any other member, and an integration that ignores it is unaffected.
pricing_model_arv_estimateThe pricing model's after-repair-value estimate for this property, rounded to the nearest thousand dollars. Read from the model's own value distribution rather than from the comparable sales, so it does not move when comparable sales are added or removed — the Comp Band is the number that does. Absent when model_estimate_available is false.
The predicted value distribution for this property, as quantile level to predicted value. The full distribution is returned rather than a single number: where the scoring service exposes its uncertainty, Investorlift Data Services surfaces it rather than hiding it. Absent when model_estimate_available is false.
valuation_meanThe predicted value for this property as a single point estimate. Optional: the scoring service does not always produce one, and its absence does not make the distribution above any less complete. Absent when model_estimate_available is false.
effective_sample_sizeHow much comparable evidence supported the model's estimate. A low value means the distribution above rests on thin evidence and should be read with more caution. Absent when model_estimate_available is false, because it describes an estimate that was withheld.
The Comp Band: the value range implied by the comparable sales below, size-normalised to this property where their square footage allows it. This is the number derived from recorded sales rather than from a model. Absent when too few comparable sales carried a usable price to state a range honestly — a range built on one or two sales reads as high confidence over the thinnest possible evidence.
rehab_budgetThe repair budget the numbers below were built on, in whole dollars — the figure the arithmetic actually used. When you sent a rehab_budget, this is your number. When you did not, it is the whole-project midpoint for the condition you submitted, and zero when you sent no condition, which is the same as sending turn_key. A bracket figure is a screening range reduced to a single number, not a contractor bid: small homes skew high per square foot, and the heavier brackets are the least reliable in the set. Sending your own budget replaces that estimate with your own.
rehab_adjusted_arvThe after-repair value this deal is priced against, in whole dollars: the Comp Band's middle value lifted toward its upper end in proportion to the repair budget, because a heavier renovation signals a higher-finish result. It equals the middle of the Comp Band when there is no repair signal and never exceeds the upper end, so the number stays anchored to sales that actually happened. It is derived from the comparable sales rather than from the model, so it moves when the comparable sales do. The thresholds that shape the lift are policy figures calibrated by judgment, not fitted parameters. Absent whenever the Comp Band is absent.
target_marginThe profit margin the maximum allowable offer (max_allowable_offer, below) was solved at, as a fraction of rehab_adjusted_arv — 0.2 means twenty percent. Always present on a priced answer, whether or not you sent a target_margin: when you sent one it is your figure, and when you did not it is the default this service priced at. It is published either way so that "what margin is this price built on?" is answerable on every response rather than only on the ones that named it. The default is a policy figure calibrated by judgment, not a fitted parameter. Absent whenever the Comp Band is absent.
The maximum allowable offer (MAO): the highest purchase price at which a cash flip buyer on standard financing still clears the target margin. It is the algebraic inverse of a flip pro forma rather than a price quantile, so a seller's suggested price and a buyer's underwriting agree by construction.
This is the investor's ceiling — your offer to the seller is this minus your fee.
It is not a prediction of what the property will trade at. The financing figures behind it — down payment, interest, points, closing costs, hold period and target margin — are policy figures calibrated by judgment and intended to be tuned; they are not fitted to any data set. Absent whenever the Comp Band is absent.
The line items behind the maximum allowable offer — the deal as the flip buyer it is solved for would carry it. Present on exactly the same answers max_allowable_offer is present on, and absent whenever the Comp Band is absent.
These numbers are whole dollars, and down_payment plus loan is the maximum allowable offer exactly. Rounding is applied once, above both the price and these lines, so the figures you read here are the figures that add up — there is never a rounded total that disagrees with its own rounded parts. That identity holds on every answer, including the ones where no price could be solved.
When a price was solved — max_allowable_offer.clamped is false — the whole stack reconciles. Add down_payment, loan, rehab_budget, interest, points, closing_costs and target_profit and you land back at rehab_adjusted_arv. The gap is rounding and nothing else — the price to the nearest thousand, rehab_adjusted_arv to the nearest thousand, and each remaining line to the nearest dollar — so it stays a little over a thousand dollars across the repair budgets this API brackets, and grows with a very large repair budget because a longer hold puts more financing cost on each rounded dollar of price.
When clamped is true there is nothing to reconcile. No price in range cleared the target margin, so the published price is a floor rather than a solution; the lines still describe that published price, but they will not add back to rehab_adjusted_arv and the difference can be large. Read clamped first on those answers.
Every figure here follows from the financing assumptions behind the maximum allowable offer, which are policy figures calibrated by judgment and intended to be tuned — not a quote from any lender, and not fitted to a data set.
A price-per-square-foot range taken over the comparable sales listed in comps, stated as evidence beside comp_band rather than as part of the valuation. It feeds nothing: no other member of this response is computed from it. Read basis to learn which sales it covers. It is present whenever at least one comparable sale carries both a usable sale price and a usable square footage, INCLUDING on answers where the model estimate was withheld (model_estimate_available: false), because it is computed from the comparable sales rather than from the model. It is absent when no comparable sale carries both. No member of it is ever null.
The comparable sales the Comp Band was derived from, in the order the scoring service ranked them, as stored by the property data service. The property's own prior sale is removed before anything is computed. Absent when the scoring service returned none.
BatchScoredCallItem
model_estimate_availableWhether the pricing model produced an estimate Investorlift Data Services was able to confirm for this property. Always present, alongside subject_property. When false, the model's estimate and its distribution are withheld from this response: they were checked against the comparable sales found for this property and did not agree with them, and a confidently wrong valuation is worse than none. The Comp Band and the comparable sales are unaffected — they are derived from the sales themselves — and this call is charged as normal, because it still carries a valuation.
The property this answer is about, and the facts the valuation actually ran on. Always present on a scored answer, including one where the model's estimate was withheld. It is here so a mis-resolved address or a thin county record is visible before you act on the numbers: check that the address and the facts below describe the house you meant.
Every fact carries where it came from. county-record means the property data service's stored value for this property; caller-stated means a value you supplied in its place. Those are the only two values. A fact reads caller-stated when you supplied it through the overrides request option, and county-record otherwise — including partial_bathrooms, which cannot be overridden. A value you supply reads caller-stated even when it matches the county record's own figure.
A fact that is missing is missing on purpose. When the county record does not carry a usable value for something, that fact is left out of facts entirely rather than returned as null, 0 or an empty string. Absence is information: the valuation ran without it too. A recorded living area of zero is treated as no living area, not as a house that measures nothing.
This block is additive. It was added without changing any other member, and an integration that ignores it is unaffected.
pricing_model_arv_estimateThe pricing model's after-repair-value estimate for this property, rounded to the nearest thousand dollars. Read from the model's own value distribution rather than from the comparable sales, so it does not move when comparable sales are added or removed — the Comp Band is the number that does. Absent when model_estimate_available is false.
The predicted value distribution for this property, as quantile level to predicted value. The full distribution is returned rather than a single number: where the scoring service exposes its uncertainty, Investorlift Data Services surfaces it rather than hiding it. Absent when model_estimate_available is false.
valuation_meanThe predicted value for this property as a single point estimate. Optional: the scoring service does not always produce one, and its absence does not make the distribution above any less complete. Absent when model_estimate_available is false.
effective_sample_sizeHow much comparable evidence supported the model's estimate. A low value means the distribution above rests on thin evidence and should be read with more caution. Absent when model_estimate_available is false, because it describes an estimate that was withheld.
The Comp Band: the value range implied by the comparable sales found for this property, size-normalised to this property where their square footage allows it. This is the number derived from recorded sales rather than from a model. Absent when too few comparable sales carried a usable price to state a range honestly — a range built on one or two sales reads as high confidence over the thinnest possible evidence.
rehab_budgetThe repair budget the numbers below were built on, in whole dollars — the figure the arithmetic actually used. When you sent a rehab_budget, this is your number. When you did not, it is the whole-project midpoint for the condition you submitted, and zero when you sent no condition, which is the same as sending turn_key. A bracket figure is a screening range reduced to a single number, not a contractor bid: small homes skew high per square foot, and the heavier brackets are the least reliable in the set. Sending your own budget replaces that estimate with your own.
rehab_adjusted_arvThe after-repair value this deal is priced against, in whole dollars: the Comp Band's middle value lifted toward its upper end in proportion to the repair budget, because a heavier renovation signals a higher-finish result. It equals the middle of the Comp Band when there is no repair signal and never exceeds the upper end, so the number stays anchored to sales that actually happened. It is derived from the comparable sales rather than from the model, so it moves when the comparable sales do. The thresholds that shape the lift are policy figures calibrated by judgment, not fitted parameters. Absent whenever the Comp Band is absent.
target_marginThe profit margin the maximum allowable offer (max_allowable_offer, below) was solved at, as a fraction of rehab_adjusted_arv — 0.2 means twenty percent. Always present on a priced answer, whether or not you sent a target_margin: when you sent one it is your figure, and when you did not it is the default this service priced at. It is published either way so that "what margin is this price built on?" is answerable on every response rather than only on the ones that named it. The default is a policy figure calibrated by judgment, not a fitted parameter. Absent whenever the Comp Band is absent.
The maximum allowable offer (MAO): the highest purchase price at which a cash flip buyer on standard financing still clears the target margin. It is the algebraic inverse of a flip pro forma rather than a price quantile, so a seller's suggested price and a buyer's underwriting agree by construction.
This is the investor's ceiling — your offer to the seller is this minus your fee.
It is not a prediction of what the property will trade at. The financing figures behind it — down payment, interest, points, closing costs, hold period and target margin — are policy figures calibrated by judgment and intended to be tuned; they are not fitted to any data set. Absent whenever the Comp Band is absent.
The line items behind the maximum allowable offer — the deal as the flip buyer it is solved for would carry it. Present on exactly the same answers max_allowable_offer is present on, and absent whenever the Comp Band is absent.
These numbers are whole dollars, and down_payment plus loan is the maximum allowable offer exactly. Rounding is applied once, above both the price and these lines, so the figures you read here are the figures that add up — there is never a rounded total that disagrees with its own rounded parts. That identity holds on every answer, including the ones where no price could be solved.
When a price was solved — max_allowable_offer.clamped is false — the whole stack reconciles. Add down_payment, loan, rehab_budget, interest, points, closing_costs and target_profit and you land back at rehab_adjusted_arv. The gap is rounding and nothing else — the price to the nearest thousand, rehab_adjusted_arv to the nearest thousand, and each remaining line to the nearest dollar — so it stays a little over a thousand dollars across the repair budgets this API brackets, and grows with a very large repair budget because a longer hold puts more financing cost on each rounded dollar of price.
When clamped is true there is nothing to reconcile. No price in range cleared the target margin, so the published price is a floor rather than a solution; the lines still describe that published price, but they will not add back to rehab_adjusted_arv and the difference can be large. Read clamped first on those answers.
Every figure here follows from the financing assumptions behind the maximum allowable offer, which are policy figures calibrated by judgment and intended to be tuned — not a quote from any lender, and not fitted to a data set.
A price-per-square-foot range taken over the comparable sales found for this property. A batch answer does not list those sales — score the property on its own with POST /v1/predict to see them. It is, stated as evidence beside comp_band rather than as part of the valuation. It feeds nothing: no other member of this response is computed from it. Read basis to learn which sales it covers. It is present whenever at least one comparable sale carries both a usable sale price and a usable square footage, INCLUDING on answers where the model estimate was withheld (model_estimate_available: false), because it is computed from the comparable sales rather than from the model. It is absent when no comparable sale carries both. No member of it is ever null.
HistoryCallResponse
The property this history describes, read back to you. This is the same block a Scored Call publishes — same members, same provenance labels, same honesty members — so a comparable property you looked up by property_id can never be silently narrated as a different house. On this endpoint every fact carries the source county-record: there is no what-if on a History Call, so no fact here is ever caller-stated.
records_statementA plain sentence stating what was checked and what was found, suitable to show a colleague. Fixed wording selected from a table — never assembled, and it never repeats the address or identifier you submitted. It makes no claim about your Balance: what a call cost is recorded on the Ledger, not asserted in the answer.
The chain of title, newest first. Events the record leaves undated cannot be ordered and are listed last rather than presented as the oldest. A transaction that appears in more than one county record set is published once.
Detected buy/sell pairs, newest first. A pair is reported only when both legs carry a real market price — a leg recorded at a nominal price would make the percentage gain a fabricated number — and only when neither leg was a family transfer.
How long the current owner has held title, and a plain statement of what cannot be told you about their loan.
There is no payoff member and no equity member here, and there is no null one either. This chapter was specified to publish a payoff range and an equity range derived from the loan recorded at the property's last sale. We went looking for that record — through the property data service's full published route list, through thirty-one candidate record-set names, and by matching every one of 579 distinct column names it returns across a sample of properties — and no per-property loan, mortgage or lien record is available to us: no loan amount, no loan date, no lender, no rate, no maturity and no payoff.
Nothing is inferred from that absence. This answer never says a property is owned free and clear and never says a purchase was made in cash. A missing record means we did not find one to look at; it does not mean no loan exists.
Were such a record to become available, a payoff derived from the loan recorded at the last sale would still be an estimate about the past — refinances after that sale are invisible to the public record — which is why it would be published as a range with its basis stated, never as a point figure.
Recorded permit work on this property, and an honest word about coverage.
Records-unavailable is never reported as an absence of permits. There is no signal available to us that distinguishes this property has no permits from this county publishes no permit records — an identifier that does not exist at all returns the same empty answer as a real property with a clean record. Three different facts, one identical response. So coverage_known is true only when at least one permit record was actually returned, and it is never inferred from an empty result.
A permit lookup that fails outright is reported the same way, and the call is still charged. The statement it produces is identical because it is identical in truth: we cannot report permit records for this property. The rest of the answer is unaffected.
Read coverage_known, not the length of permits.
The current listing story for this property.
No agent, no office, no brokerage and no listing URL appears here. The underlying record carries a full marketing contact list — names, e-mail addresses, phone numbers and licence numbers — and none of it is published. What is published is the listing's state.
The same facts, shaped for a CRM field or an agent chain. Every member is a boolean, a fixed category or null — no free text and no sentence.
It is computed from the chapters above it, never from a second reading of the underlying record, so it is structurally incapable of disagreeing with the detail it summarises.
A value whose chapter established nothing is null or unknown, never false. false means we checked, and no.
ValidationVerdict
validWhether this body would be accepted by POST /v1/predict. Always true on a 200 — a body that would be rejected returns the same 400 or 413 the Metered Call returns.
ProblemDetail
typeA stable URI identifying what went wrong. Branch on this, not on the wording.
titleA short, stable summary.
detailWhat happened, what it means for your Credits, and what to do next.
statusThe HTTP status code, repeated in the body.
trace_idThe Trace ID for this request. Quote it to support.