Skip to main content
One worked example per tool follows. Each is the arguments object of a tools/call, run through the curl call, and the answer cut to the fields that carry the point. Every answer arrives inside the same envelope. So a single-record block is the contents of data, and a list block shows data beside whichever of page and summary came with it. meta appears only where it carries the point. The full field list of each answer is in the tool’s own description. godmode_coverage, no arguments: one row per loaded market plus the three key facts and the account block of Keys and headers.
hou has no agents_data_end, so every agent call for that market answers agents_unavailable (see Errors). account (API 0.27.0) is the plan’s standing after the call, cut here like the phx row. The block carries the API’s exact period count, the line it stops at and remaining. It also carries the Free plan’s lifetime budget, the plan’s limits and its request rate. counters says if the API read the counts. Keys and headers shows the block field by field. godmode_deals_summary with {"latitude": 33.476917, "longitude": -111.920385, "radius_miles": 2}:
The same tool with {"zip": ["85257"]} answers the same object for one ZIP’s parcels instead of a circle. latitude and longitude beside a zip or a city are the reference point only, and change nothing in this answer. godmode_deals_search with {"latitude": 33.476917, "longitude": -111.920385, "radius_miles": 1, "kind": ["flip"], "limit": 2}. A concise row has 19 keys. The same row in detailed has 39, and adds seller, end_buyer and owner.
godmode_deal_get with {"deal_id": "deal_fc652f5954a9641c146686b035b405b7"}, a confirmed current holding, so the row carries an owner block. On this key the API withholds the identity, with the redaction visible.
meta.contact reads redacted_no_scope, which is what every key on this host sees. For the partner keys that do get contact data (Keys and headers), the API fills in owner.names (given first) and owner.mailing. It also fills in the agents’ names, phones, emails and licence numbers. On those keys meta.contact reads served, and the API audits the call. godmode_buyers_match with {"latitude": 33.476917, "longitude": -111.920385, "radius_miles": 2, "subject_asking_price": 410000, "subject_condition": "MAJOR_REHAB", "limit": 2}. summary counts the whole radius while data is one page. meta.weights is what the ranking used. meta.truncated says the concise format cut sample_deals to two.
godmode_investors_nearby with {"latitude": 33.476917, "longitude": -111.920385, "radius_miles": 1, "limit": 1}: investor is the whole market, and in_radius is what they did inside this geometry.
The contact block keeps its counts and shows nulls where the identifying fields sit: that is the evidence a null is a rule. include_institutional: true on the same call raised n_investors_ranked from 1,704 to 1,723 and put OPENDOOR PROPERTY TRUST (scale institutional) at the top. godmode_investor_lookup with {"investor_id": "inv_70f5dd32e592"} returns resolved: true and the profile:
{"name": "salt river", "market": "phx"} returns resolved: false instead: six candidates matched at tokens and none at exact. capped is false: the six are all of them. The block shows the first two of the six. The first matched on a person’s deed name, so matched_name is null with contact_redacted: true on this key. The tool reports the hit and not the name:
{"name": "SALT RIVER EQUITY LLC", "market": "phx"} matches one candidate at exact and resolves to the profile. godmode_investor_deals with {"investor_id": "inv_70f5dd32e592", "role": "buyer", "limit": 2}. owner_test: "FAILED" says the MLS listing on that parcel is not this investor’s, so counted is false. role: "seller" lists the deals where they sold. role: "any" lists both sides, each deal once.
godmode_property_lookup with {"latitude": 33.477079, "longitude": -111.921223}, the point form (nearest parcel within 100 metres). {"apn": "131-28-174", "county": "Maricopa"} resolved to the same parcel.
An APN can name distinct parcels: two counties, or twins over 100 metres apart. Such an APN comes back as resolved: false with candidates that carry id, county_fips, city, unit and n_deals. A street address with its zip or city resolves the same way (address: "7522 E Cholla St", zip: "85254"). A building of several units comes back as resolved: false with one candidate per unit until unit picks one. Areas are coordinates or a bounding box, never an address: the server does not geocode. godmode_property_search asks for a ZIP the history lake covers. Counties, cities and ZIP codes lists them:
A list tool, so owner.names and owner.mailing are not on the row on any key, and meta.contact reads not_on_lists. The blocks not asked for are null, not empty: sale, tax, listing, financing, permits, history. summary.dated_filters names the parts of this request that read the June snapshot. meta.dated[] names the dated block in the response. See Dated data.
The same ZIP and quicklists with "count_only": true return no rows and "summary": { "total": 7328, "dated_filters": ["quicklist high-equity"], "...": "..." }: a paged call leaves total null, and a counting call fills it. Every row of the ZIP carries quicklists[], computed from the same expressions the filters use. So the first row above also reports free-and-clear although nobody asked for it. godmode_property_financing with {"property_id": "prop_000055fcd5540ebdcb60827fecb1d99a"}, a condominium with one open lien. Every value here is a snapshot at as_of, and meta.dated[] names financing and valuation with that date.
meta.contact reads redacted_no_scope, which is what every key on this host sees. borrowers[] on a mortgage and parties[] on an involuntary lien are not on the record. For the partner keys that do get contact data (Keys and headers), they are present and the API audits the call. The golden Scottsdale parcel (prop_e93c776c53354a88de4e58448a6bf21b) shows the other shape. It has open_lien_count 0 with free_and_clear true, a 100 percent equity_percent, and one involuntary_liens[] row. That row is a 2023 UCC financing statement, which puts liens in meta.dated[] too. Its lien_type is “Economic Lien” and its document_type is “Financing Statement”. The API refuses the same call with "require_current": true instead of serving it:
godmode_property_permits with {"property_id": "prop_0002abe5e1541497279888693bdcb965"}, a shopping centre on Thomas Road with 29 permits on record. The concise format keeps ten, newest issue date first, and says so in meta.truncated. detailed returns them all with the duration and fee fields.
n_open_permits_12m is 18 because most of these sign and tenant-improvement permits never closed out. The count and the open-permit quicklist mean a permit active or in_review for more than a year. Applicant names are on no field on any key. godmode_property_history with {"property_id": "prop_0141251561e4259fe621ecb1bd958100", "limit": 6}, a condominium inside the lake. coverage says which weeks each domain runs over. Valuation and financing stop at the financing slice date, and the rest run to the last file replayed. summary is the block the search filters read. Each event carries the domain’s own columns before and after, keyed as the delivery names them. The example cuts the listing columns to the price and status.
The relist is a rental listing that went off market and a sale listing that appeared the same week. span_weeks: 2 on the two older events means no file arrived the week between. So the API dates the change to the first file after the gap. The avm event is what puts valuation in meta.dated[]. The listing columns also carry the agent’s name and licence number, and the ownership columns carry the owner’s name. On this key the payload leaves out those columns, and meta.contact reads redacted_no_scope. For a parcel in a ZIP outside the lake, the same call answers history_unavailable. zips in the error names what the lake covers. godmode_listing_history with {"property_id": "prop_0141251561e4259fe621ecb1bd958100"}: the same condominium’s listing events cut into one cycle, still on the market.
listed_on, 2026-07-01, is the feed’s own date. first_week is a week later: the file the replay first saw the listing in. days_on_market runs from listed_on. agent_name and agent_license are on the cycle only with contact access. Even then this cycle carries the licence as null, because the 2026 files carry no licence number for this agent. godmode_property_comps with {"property_id": "prop_e93c776c53354a88de4e58448a6bf21b", "radius_miles": 1, "days_back": 365, "limit": 25}: the comparable sales around a 1959 three-bedroom in south Scottsdale, most similar first. The block shows two of the twenty-five.
The first comp is an MLS close: 44 days on market, listed at 675,000. The second is a deed the registry knows the purchase side of: an investor’s exit after 1,147 days with 75,000 of gross profit. cash_sale_proxy is null on both because the market does not measure it. sale_mortgage_measured is false on the coverage row. The concise format keeps ten comps. price_per_sqft_value is the median price per square foot over the twenty-five times the subject’s 1,409 sqft, an indication and not a valuation. godmode_market_changes, over the same covered ZIP:
The same events counted across every parcel of the ZIP, oldest week first.
parcels_observed is the ZIP’s row count in that week’s file: every parcel on the FULL delivery, and only the changed ones on a DELTA. So it is never a denominator. new_mortgages is 0 in every week because the financing window ended at the market’s parcel.financing.as_of. A request for it puts financing in meta.dated[]. A flat financing tail after that date is the delivery, not the market. A ZIP outside the lake answers history_unavailable, and zips in the error names what the lake covers. godmode_lender_lookup with {"lender_id": "len_d2028f0766fc"} returns resolved: true and the profile. The example cuts the profile to the identity, the union totals and the one market’s rankings and coverage. {"name": "Kiavi Funding Inc", "market": "phx"} matches one candidate at exact and resolves to the same profile. {"name": "LendingHome", "market": "phx"} finds the same id through the spelling LENDINGHOME FUNDING CORP, which the candidate reports as matched_name. Every value is a snapshot at as_of, and meta.dated[] names lenders beside financing. Since 0.17.0 a lender_id from an earlier registry run opens the current lender. meta.resolved_from lists the ids the API followed. This holds on this tool as on godmode_lender_loans and godmode_lender_borrowers. A retired id is a gone error result whose body names the reason and the run. The profile carries class_basis, successor, nmls and id_history in both formats.
n_in_history_24m (56) against n_loans_24m (222) is the one-in-five history on one lender. The history holds a lower bound, and the union of the two tables is the origination count. meta.contact reads redacted_no_scope on every key, because no lender object carries a contact field. Nothing in any delivery holds a lender’s phone or email, and the names are business records served in full. godmode_lenders_top with {"market": "phx", "hard_money": true, "limit": 2}: the hard-money lenders of the market over the 24 months to the slice date, most loans first. rank is the position in this list, and share stays the share of the whole market’s instruments. {"market": "phx", "zip": "85032", "hard_money": true} ranks the same lenders inside one ZIP. A ZIP outside Maricopa County answers outside_coverage and names the covered counties.
The golden lender of the lookup above is fourth on this ranking (rank_hard_money_24m 4 on its profile). The concise row drops n_unpriced, n_first_lien, n_heloc and n_parcels, which response_format: "detailed" keeps. Since 0.19.0 {"period": "2026-05"} ranks the market over one month: one of the 36 months to the slice month. Beside zip, city or county, period also takes 12m, all or a calendar year such as 2025 (from 2002). Any other value, or a year or window market-wide, is a validation_error with code period_not_served. The row carries share_by_volume and n_borrowers. godmode_lenders_nearby with {"market": "phx", "latitude": 33.476917, "longitude": -111.920385, "radius_miles": 2, "hard_money": true, "limit": 2} (0.19.0): the lenders active around a point, most loans in the window first, the same ranking row as godmode_lenders_top. market is the list’s, as on godmode_lenders_top. With two markets loaded, the tool answers market_required without it. The geometry is a point with radius_miles, a bbox, or property_id. The API resolves it to the H3 res-8 cells whose centre lies inside it, about a third of a square mile each. So its edge is a hex boundary and not the circle. Each row’s in_geometry says how many cells the circle became (n_cells) and how many of them carry the lender (n_cells_lent). The API sums n, volume and the product counts over those cells. share, share_by_volume, n_unpriced, n_deals_financed and n_borrowers read null, because the API measures none of them per geometry. period is 24m, 12m or all here: the registry keeps cells at those three. lender_class, hard_money, include_persons, include_government, position, product and sort are the list’s. A point outside every loaded market’s tolerance answers outside_coverage. A registry built before the place rankings answers lenders_unavailable. extras carries reference_point, dated and truncated, and no contact field is on any key (meta.contact reads not_on_lists). The same rows are GET /v1/lenders with lat, lng and radius_miles.
godmode_lender_loans with {"lender_id": "len_d2028f0766fc", "market": "phx", "limit": 2}: the golden lender’s loans, newest recording first, one row per instrument. The row is the open row where the instrument has one, else its recorded slot. {"recorded_from": "2026-01-01"} cuts the window. {"product": ["CONSTRUCTION"]} or {"term_band": ["LE_24M"]} cuts the product, and {"zip": "85032"} cuts the place. The same rows are GET /v1/lenders/{id}/loans, which also answers as a CSV file.
The two rows are the recorded example of the REST route, projected. The concise row drops market, loan_key, the outlier and pairing flags, label_as_recorded, product_basis, open_position, assigned_lender_name, blanket_n_parcels, county_fips and property_type_category. response_format: "detailed" keeps them. The borrowers on a loan are a contact field, so the list leaves the field out of every row, on any key: meta.contact reads not_on_lists. The first row is a recorded slot with no open twin: in_both false, lender_id_open null, no balance. The second is an open first lien. recording_date is the newest first, and every row is a snapshot at as_of. Since 0.16.0 the concise loan row also carries purpose, from the deeds and never from the label. It carries deed on a PURCHASE row: the deed price and the loan against it. It carries deal, the investor deal the registry ties the loan to: its id, kind, if this was its purchase loan, and the investor. It also carries outcome and investor_id. godmode_deal_get returns the deal’s own dates and prices. The borrower keys, borrower_match and months_to_resolution are on the detailed row alone. The profile carries the borrowers, investor_lending and flips_financed blocks. In the concise format they hold five top borrowers, the competing lenders and investors, and three flip years. On the two rows above both loans are PURCHASE against their deeds. The construction loan is at 1.34 times the lot’s price, and the open first lien at 0.94. The fold resolved each borrower to a registered investor. deal and outcome read null because both recording dates are in June 2026, after the link window closed. The window closes at recordings_through less 45 days. For a deal bought after that date, null means not measured, never absent. godmode_lender_borrowers with {"lender_id": "len_d2028f0766fc", "market": "phx", "registered_only": true, "limit": 2} (0.16.0): the golden lender’s borrowers, most loans in the 24 months first, one row per borrower key. borrower_key is a salted hash of the folded name, the same key on every lender’s rows. name is for a company. investor is the registered investor behind the key: id, registry name, kinds, scale, size. Then come borrower_match, the loans and volume from this lender, last_loan_on, n_lenders_used_24m and other_lender_ids. The churn triple is churned, churn_measured and moved_to_lender_id: a lower bound of leaving, on a feed that sees one loan in five. The row also carries n_deals_financed. {"churned": true} keeps the borrowers who left. {"q": "holdings"} finds a company by name, and {"investor_kind": ["FLIPPER"]} finds the flippers. {"period": "all"} counts the whole history. A person’s name and every party_key are null on every row of this list, on any key: meta.contact reads not_on_lists and contact_redacted is true. The list serves a company’s name and investor.name. The concise row drops market, party_key, n_loans_12m and first_loan_on, and the same rows are GET /v1/lenders/{id}/borrowers.
The two rows date from 2026-09-15 after the phase-3 build swapped on stage, on a deals key. Both borrowers are companies, so the list serves their names. One resolved by its entity name and one through the deal it bought with the loan. contact_redacted is true because the list drops a person’s name and every party_key. The ranking tool always leaves out person-named and GOVERNMENT lenders: the REST route’s include_persons and include_government are not among its inputs. The nearby tool carries both. A market with no published lender registry answers lenders_unavailable on all five tools. A registry built before the borrower match answers it on the borrowers tool. One built before the place rankings answers it on the nearby tool, and under a period other than 24m on the ranking tool (see Errors).