{"openapi":"3.1.0","info":{"title":"InvestorBase API","version":"1.0.0","description":"Programmatic access to InvestorBase property data: address lookup, buyer search, analytics, comps and linked deals, plus account management for enterprise integrations. Use it to bring InvestorBase data into a CRM, a property analysis tool or a lead generation platform.\n\nThis reference is generated from the API's OpenAPI 3.1 document, published at [https://www.investorbase.com/api-docs/openapi.json](https://www.investorbase.com/api-docs/openapi.json). Use it to generate a client, import the API into a tool such as Postman, or give an AI agent the endpoint definitions.\n\nThe base URL is `https://api.investorbase.com`, and each endpoint path carries its version, such as `/v1/autocomplete`. Call it over HTTPS and send `Content-Type: application/json` on every request with a body.\n\n## Authentication\n\nSend your key in the `x-api-key` header on every request. There are two kinds of key:\n\n| Key | Where it comes from | Extra header |\n| --- | --- | --- |\n| Subscriber key | Account → Integrations in InvestorBase | None |\n| Enterprise key | Issued by InvestorBase for an integration | `x-user-id`, your identifier for the end user the request is made for. Limits and usage are tracked per end user. |\n\nAccount management endpoints accept enterprise keys only. Subscriber keys need an active InvestorBase subscription, and trials count.\n\nKeep the key secret. Call the API from your own backend and never ship the key in browser or mobile code. Regenerating a subscriber key revokes the old one immediately, including for every integration that uses it. If an enterprise key may have leaked, email developer@investorbase.com right away.\n\n## Getting started with an enterprise key\n\n1. Call `GET /v1/api-credentials` to see your per-minute limit, the endpoints your key may call and the plans you can assign.\n2. Register each end user with `POST /v1/api-users`, using your own identifier as `user_id`.\n3. Assign a plan to the user with `POST /v1/api-user-subscriptions`.\n4. Call the property data endpoints with your key in `x-api-key` and the user's identifier in `x-user-id`.\n\nA request for an unknown or inactive user returns `401`, and a request for an endpoint none of the user's active subscriptions cover returns `403`.\n\n## Rate limits\n\nEvery response carries `X-RateLimit-Limit` and `X-RateLimit-Remaining` for the per-minute limit, plus `X-Monthly-Limit` and `X-Monthly-Remaining` where a monthly limit applies. Going over a limit returns `429` with a JSON `error` message. Only successful requests count toward monthly limits.\n\nTraffic bursts can also be rejected before they reach the API. That `429` has a plain-text body and no rate-limit headers, so wait before retrying.\n\n### Subscriber keys\n\n| Limit | Value |\n| --- | --- |\n| Requests per minute, across all endpoints | 20 |\n| Buyer searches per month | 25 |\n| Analytics searches per month | 100 |\n| Analytics summary, retail comps, investor comps and linked deals, each per month | 100 |\n| Autocomplete per month | 10,000 |\n\nBuyer searches and analytics searches draw from the same counted pool as your searches in the InvestorBase app, deduplicated by property. A buyer search on a property your company already skiptraced, or an analytics search on a location it already searched, does not count again, even in a later month. A property your company searched but never skiptraced still counts on its first buyer search. Reaching an API limit never blocks searching in the app.\n\nPlans with custom limits use those limits on the API too. If your plan's own limit is lower, as during a trial, the lower one applies. Monthly limits reset at the start of each calendar month.\n\nNeed higher limits? Email developer@investorbase.com.\n\n### Enterprise keys\n\nThe per-minute limit covers the whole key and is returned by `GET /v1/api-credentials`. Each end user gets the monthly allowance of the plans assigned through `/v1/api-user-subscriptions`, per endpoint, and several active subscriptions add up. A plan's `analytics_search_limit` covers both analytics search and analytics summary, counted separately.\n\n## Errors\n\nErrors return a JSON body with an `error` message written for the developer. Some responses add a machine readable `code` or `reason`.\n\n## Best practices\n\n1. Resolve addresses with `/v1/autocomplete` before running searches.\n2. Watch `X-RateLimit-Remaining` and `X-Monthly-Remaining` and slow down before you reach `429`.\n3. After a per-minute `429`, wait 60 seconds before retrying.\n4. After a monthly `429` on an enterprise key, check the user's usage with `GET /v1/api-users` before sending more requests for that user."},"servers":[{"url":"https://api.investorbase.com","description":"Production"}],"security":[{"apiKey":[]},{"apiKey":[],"userId":[]}],"tags":[{"name":"Property data","description":"Address lookup, buyer search, analytics, comps and linked deals."},{"name":"Account management","description":"Manage the end users of an enterprise integration and the plans assigned to them."}],"paths":{"/v1/autocomplete":{"post":{"operationId":"autocomplete","tags":["Property data"],"summary":"Autocomplete a location","description":"Takes a partial address or location and returns matching locations with their coordinates. Use it for a type-ahead search bar, or to validate an address before running other searches.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutocompleteRequest"}}}},"responses":{"200":{"description":"Matching locations. An empty list means nothing matched.","headers":{"X-RateLimit-Limit":{"required":true,"description":"Requests allowed per minute for this key.","schema":{"type":"integer","description":"Requests allowed per minute for this key."}},"X-RateLimit-Remaining":{"required":true,"description":"Requests left in the current one-minute window.","schema":{"type":"integer","description":"Requests left in the current one-minute window."}},"X-Monthly-Limit":{"schema":{"type":"integer","description":"Monthly allowance for this endpoint."}},"X-Monthly-Remaining":{"schema":{"type":"integer","description":"Requests left this calendar month for this endpoint."}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AutocompleteResult"}}}}},"400":{"description":"The request body is not valid JSON or failed validation, or the lookup rejected the search string.","content":{"application/json":{"example":{"error":"Search string must be at least 3 characters"},"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing or inactive, or an enterprise key was sent without `x-user-id`.","content":{"application/json":{"example":{"error":"API key required"},"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not authorized for this endpoint, or there is no active subscription that covers it.","content":{"application/json":{"example":{"error":"No active subscription for this endpoint"},"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"The per-minute limit or the monthly limit for this endpoint was reached.","content":{"application/json":{"example":{"error":"Rate limit exceeded"},"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"example":{"error":"Unexpected server error"},"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Address lookup returned a response we could not read. Safe to retry.","content":{"application/json":{"example":{"error":"Address lookup is temporarily unavailable. Please try again."},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/buyer-search":{"post":{"operationId":"buyerSearch","tags":["Property data"],"summary":"Search for buyers","description":"Finds investors actively buying near a subject property, flippers and landlords, with contact details from skiptracing.\n\nThe filters are the ones in the InvestorBase app, and so are the results: the same address with the same filters returns the same buyers, and a filter you leave out takes the app's default.\n\nFor subscriber keys, every search draws from the company's monthly buyer search pool, shared with the InvestorBase app. Searching again on an address your team already skiptraced is free, even past the limit.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuyerSearchRequest"}}}},"responses":{"200":{"description":"Buyers found, nearest first. An empty list means nothing matched.","headers":{"X-RateLimit-Limit":{"required":true,"description":"Requests allowed per minute for this key.","schema":{"type":"integer","description":"Requests allowed per minute for this key."}},"X-RateLimit-Remaining":{"required":true,"description":"Requests left in the current one-minute window.","schema":{"type":"integer","description":"Requests left in the current one-minute window."}},"X-Monthly-Limit":{"schema":{"type":"integer","description":"Monthly allowance for this endpoint."}},"X-Monthly-Remaining":{"schema":{"type":"integer","description":"Requests left this calendar month for this endpoint."}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BuyerSearchResult"}}}}},"202":{"description":"The search was accepted and runs in the background (`async: true`).","headers":{"X-RateLimit-Limit":{"required":true,"description":"Requests allowed per minute for this key.","schema":{"type":"integer","description":"Requests allowed per minute for this key."}},"X-RateLimit-Remaining":{"required":true,"description":"Requests left in the current one-minute window.","schema":{"type":"integer","description":"Requests left in the current one-minute window."}},"X-Monthly-Limit":{"schema":{"type":"integer","description":"Monthly allowance for this endpoint."}},"X-Monthly-Remaining":{"schema":{"type":"integer","description":"Requests left this calendar month for this endpoint."}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuyerSearchPendingResponse"}}}},"400":{"description":"The body is not valid JSON or failed validation, or it has neither an `address` nor a valid `latitude` and `longitude` pair.","content":{"application/json":{"example":{"error":"radius_miles must be a number greater than 0 and at most 10"},"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing or inactive, or an enterprise key was sent without `x-user-id`.","content":{"application/json":{"example":{"error":"API key required"},"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not authorized for this endpoint, there is no active subscription that covers it, or the subscriber seat is not allowed to run buyer searches.","content":{"application/json":{"example":{"error":"This seat cannot run buyer searches. Ask an admin on your account for a key."},"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The address could not be matched to a property, and no coordinates were sent. Nothing is counted.","content":{"application/json":{"example":{"error":"We couldn't find a property for that address. Check the address, run it through the /autocomplete endpoint first, or send latitude and longitude instead.","code":"ADDRESS_NOT_FOUND"},"schema":{"$ref":"#/components/schemas/BuyerSearchAddressNotFoundError"}}}},"429":{"description":"The per-minute limit or the monthly limit was reached. For subscriber keys, a refusal from the shared monthly buyer search pool also carries a `reason`.","content":{"application/json":{"example":{"error":"You've reached your monthly buyer search limit for the API. Addresses your team has already skiptraced can still be searched again for free. Your limit resets at the start of next month.","reason":"skiptrace_limit_exceeded"},"schema":{"$ref":"#/components/schemas/BuyerSearchLimitError"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"example":{"error":"Unexpected server error"},"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The address lookup service failed while resolving `address`.","content":{"application/json":{"example":{"error":"Address lookup is temporarily unavailable. Please try again."},"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The synchronous search exceeded the server-side processing time limit. Retry, or send `async: true`.","content":{"application/json":{"example":{"error":"Request exceeded the server-side processing time limit. Safe to retry."},"schema":{"$ref":"#/components/schemas/Error"}}}}},"callbacks":{"searchOutcome":{"{$request.body#/webhook_url}":{"post":{"summary":"Search outcome webhook","description":"Sent to `webhook_url` when the search completes or fails, in sync and async modes.","parameters":[{"in":"header","name":"x-webhook-secret","schema":{"description":"The `webhook_secret` from the request, when one was sent.","type":"string"},"description":"The `webhook_secret` from the request, when one was sent."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/BuyerSearchWebhookCompleted"},{"$ref":"#/components/schemas/BuyerSearchWebhookFailed"}]}}}},"responses":{"200":{"description":"Any response is accepted. Its status and body are ignored, and a failed delivery is not retried."}}}}}}},"get":{"operationId":"getBuyerSearchResults","tags":["Property data"],"summary":"Get async search results","description":"Fetches the results of a search started with `async: true`.","parameters":[{"in":"query","name":"search_id","schema":{"type":"string","minLength":1,"description":"The `search_id` an async `POST /v1/buyer-search` returned.","example":"550e8400-e29b-41d4-a716-446655440000"},"required":true,"description":"The `search_id` an async `POST /v1/buyer-search` returned."}],"responses":{"200":{"description":"The results. `null` while the search is still running, or when it failed.","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/BuyerSearchResult"}},{"type":"null"}]}}}},"400":{"description":"`search_id` is missing.","content":{"application/json":{"example":{"error":"search_id parameter required"},"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing or inactive, or an enterprise key was sent without `x-user-id`.","content":{"application/json":{"example":{"error":"API key required"},"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No search with that `search_id` belongs to this key.","content":{"application/json":{"example":{"error":"Search not found or access denied"},"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"example":{"error":"Unexpected server error"},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/retail-comps":{"post":{"operationId":"retailComps","tags":["Property data"],"summary":"Get retail comps for a property","description":"Returns the subject property and comparable recent sales around it, to estimate what similar properties sell for, such as an after repair value (ARV). Results include at most 10 arm's length sales. Only requests that return at least one comparable count toward the monthly limit. In non-disclosure states, where sale prices are not public record, comps come from closed MLS listings.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetailCompsRequest"}}}},"responses":{"200":{"description":"The subject property and its comparable sales.","headers":{"X-RateLimit-Limit":{"required":true,"description":"Requests allowed per minute for this key.","schema":{"type":"integer","description":"Requests allowed per minute for this key."}},"X-RateLimit-Remaining":{"required":true,"description":"Requests left in the current one-minute window.","schema":{"type":"integer","description":"Requests left in the current one-minute window."}},"X-Monthly-Limit":{"schema":{"type":"integer","description":"Monthly allowance for this endpoint."}},"X-Monthly-Remaining":{"schema":{"type":"integer","description":"Requests left this calendar month for this endpoint."}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetailCompsResponse"}}}},"400":{"description":"The request body is not valid JSON or failed validation, or the address or the property could not be evaluated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetailCompsError"},"examples":{"validation":{"summary":"Validation","value":{"error":"Address is required"}},"invalidAddress":{"summary":"Address could not be validated","value":{"error":"The address could not be validated. Please provide a full street address including house number (e.g. 123 Main St, City, State ZIP).","code":"INVALID_ADDRESS"}},"lowAddressConfidence":{"summary":"Address match too uncertain","value":{"error":"The address confidence was too low to produce reliable results. Please run your address through the /autocomplete endpoint first to ensure it matches the format our database expects.","code":"LOW_ADDRESS_CONFIDENCE"}},"nonResidential":{"summary":"Property type not supported","value":{"error":"Comparable sales are not available for this property. Valuations are only supported for residential property types; commercial and other non-residential properties are not supported.","code":"NON_RESIDENTIAL_PROPERTY_TYPE"}}}}}},"401":{"description":"The API key is missing or inactive, or an enterprise key was sent without `x-user-id`.","content":{"application/json":{"example":{"error":"API key required"},"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not authorized for this endpoint, or there is no active subscription that covers it.","content":{"application/json":{"example":{"error":"No active subscription for this endpoint"},"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not enough comparable sales were found near the property, or the property was not found.","content":{"application/json":{"example":{"error":"We weren't able to find enough comparable sales in the area. Try expanding your search distance or time range.","code":"INSUFFICIENT_COMPARABLE_SALES"},"schema":{"$ref":"#/components/schemas/RetailCompsError"}}}},"429":{"description":"The per-minute limit or the monthly limit for this endpoint was reached.","content":{"application/json":{"example":{"error":"Rate limit exceeded"},"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"example":{"error":"Unexpected server error"},"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Comparable sales lookup failed or returned a response we could not read. Safe to retry.","content":{"application/json":{"example":{"error":"Invalid response from comps service; subject property unavailable."},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/analytics-search":{"post":{"operationId":"analyticsSearch","tags":["Property data"],"summary":"Search investor activity near a location","description":"Returns recent flip and rental purchases near a location, labeled by buyer type (`flipper` or `landlord`) and sorted closest first. Use it to gauge investor activity for lead underwriting and market insight.\n\nResults are meant for area-level analysis: `address` omits the house number, and `latitude` and `longitude` are offset by up to a few hundred feet. Use `POST /v1/buyer-search` for property-level results.\n\nFor subscriber keys, each new location counts once against the monthly analytics search allowance shared with the InvestorBase app (100 by default), and repeat searches of a location are free.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsSearchRequest"}}}},"responses":{"200":{"description":"Transactions closest to the search center first. An empty list means nothing qualified nearby.","headers":{"X-RateLimit-Limit":{"required":true,"description":"Requests allowed per minute for this key.","schema":{"type":"integer","description":"Requests allowed per minute for this key."}},"X-RateLimit-Remaining":{"required":true,"description":"Requests left in the current one-minute window.","schema":{"type":"integer","description":"Requests left in the current one-minute window."}},"X-Monthly-Limit":{"schema":{"type":"integer","description":"Monthly allowance for this endpoint."}},"X-Monthly-Remaining":{"schema":{"type":"integer","description":"Requests left this calendar month for this endpoint."}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnalyticsSearchResult"}}}}},"400":{"description":"The body is not valid JSON or failed validation, or `x-api-key` (or `x-user-id` for an enterprise key) is missing.","content":{"application/json":{"example":{"error":"Latitude and longitude are required"},"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is invalid or inactive, or the enterprise end user is unknown or inactive.","content":{"application/json":{"example":{"error":"Invalid or inactive API key"},"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not authorized for this endpoint, or there is no active subscription that covers it.","content":{"application/json":{"example":{"error":"No active subscription for this endpoint"},"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"The per-minute limit, the monthly limit, or a subscriber key's monthly analytics search allowance was reached.","content":{"application/json":{"example":{"error":"You've reached your monthly analytics search limit. Repeat analyses of locations you've already searched are still free.","reason":"unskiptrace_limit_exceeded"},"schema":{"$ref":"#/components/schemas/AnalyticsSearchLimitError"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"example":{"error":"Unexpected server error"},"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"A server-side step exceeded its processing time limit. Safe to retry.","content":{"application/json":{"example":{"error":"Request exceeded the server-side processing time limit. Safe to retry."},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/analytics-summary":{"post":{"operationId":"analyticsSummary","tags":["Property data"],"summary":"Summarize the investor market near a location","description":"Returns aggregated market metrics near a location: flip and rental counts within 1, 2, 5 and 10 miles, plus pricing, price per square foot and ARV statistics for flips, and purchase aggressiveness for landlords, within `metrics_radius_mi`. Use it for lead grading, market snapshots or heatmaps without processing individual transactions.\n\nHow the metrics are computed, for both `flipper_metrics` and `landlord_metrics`:\n\n* `count` is the size of the cleaned sample: only transactions with usable price and living area data are included, so it is often lower than the matching entry in `radius_counts`.\n* `*_low` and `*_high` are the 33rd and 67th percentiles, the middle third of the sample. They are a typical range, not the minimum and maximum.\n* `*_avg` is the mean of the whole cleaned sample with no outlier removal, so it can fall outside the `*_low` to `*_high` range.\n* Every metric is `0` when no transaction qualifies.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsSummaryRequest"}}}},"responses":{"200":{"description":"Market metrics for the location.","headers":{"X-RateLimit-Limit":{"required":true,"description":"Requests allowed per minute for this key.","schema":{"type":"integer","description":"Requests allowed per minute for this key."}},"X-RateLimit-Remaining":{"required":true,"description":"Requests left in the current one-minute window.","schema":{"type":"integer","description":"Requests left in the current one-minute window."}},"X-Monthly-Limit":{"schema":{"type":"integer","description":"Monthly allowance for this endpoint."}},"X-Monthly-Remaining":{"schema":{"type":"integer","description":"Requests left this calendar month for this endpoint."}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsSummaryResponse"}}}},"400":{"description":"The body is not valid JSON or failed validation, or `x-api-key` (or `x-user-id` for an enterprise key) is missing.","content":{"application/json":{"example":{"error":"lookback_months must be an integer between 1 and 60"},"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is invalid or inactive, or the enterprise end user is unknown or inactive.","content":{"application/json":{"example":{"error":"Invalid or inactive API key"},"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not authorized for this endpoint, or there is no active subscription that covers it.","content":{"application/json":{"example":{"error":"No active subscription for this endpoint"},"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"The per-minute limit or the monthly limit for this endpoint was reached.","content":{"application/json":{"example":{"error":"Rate limit exceeded"},"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"example":{"error":"Unexpected server error"},"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"A server-side step exceeded its processing time limit. Safe to retry.","content":{"application/json":{"example":{"error":"Request exceeded the server-side processing time limit. Safe to retry."},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/investor-comps":{"post":{"operationId":"investorComps","tags":["Property data"],"summary":"Find investor comps","description":"Returns recent investor purchases near a location: flips (bought and resold by an investor) and rental acquisitions (bought by a landlord). Use it to see what investors pay in an area, which often differs from retail value.\n\nWithout `subject_property_details`, the response lists recent flips and rentals, nearest first, with no `rank` or `pricePerSqFt`.\n\nWith `subject_property_details`, even `{}`, the comps are filtered and ranked by how closely they match the subject in size, location and utility, and the best matches come back with `rank` and `pricePerSqFt`.\n\nOnly requests that return at least one comp count toward the monthly limit.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestorCompsRequest"}}}},"responses":{"200":{"description":"Investor comps. An empty list means nothing matched.","headers":{"X-RateLimit-Limit":{"required":true,"description":"Requests allowed per minute for this key.","schema":{"type":"integer","description":"Requests allowed per minute for this key."}},"X-RateLimit-Remaining":{"required":true,"description":"Requests left in the current one-minute window.","schema":{"type":"integer","description":"Requests left in the current one-minute window."}},"X-Monthly-Limit":{"schema":{"type":"integer","description":"Monthly allowance for this endpoint."}},"X-Monthly-Remaining":{"schema":{"type":"integer","description":"Requests left this calendar month for this endpoint."}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InvestorCompsResult"}}}}},"400":{"description":"The body is not valid JSON or failed validation, or the `x-api-key` header (or `x-user-id` for an enterprise key) is missing.","content":{"application/json":{"example":{"error":"Latitude and longitude are required"},"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is invalid or inactive, or the enterprise end user is unknown or inactive.","content":{"application/json":{"example":{"error":"Invalid or inactive API key"},"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not authorized for this endpoint, or there is no active subscription that covers it.","content":{"application/json":{"example":{"error":"No active subscription for this endpoint"},"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"The per-minute limit or the monthly limit for this endpoint was reached.","content":{"application/json":{"example":{"error":"Rate limit exceeded"},"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"example":{"error":"Unexpected server error"},"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"A server-side step exceeded its processing time limit. Safe to retry.","content":{"application/json":{"example":{"error":"Request exceeded the server-side processing time limit. Safe to retry."},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/linked-deals":{"post":{"operationId":"linkedDeals","tags":["Property data"],"summary":"Get a buyer's linked deals","description":"Finds the flips and rentals linked to one buyer, identified by entity name or by mailing address, and returns portfolio statistics plus up to 250 of the most recent deals. Use it for buyer profile pages or to underwrite an investor's track record. Only lookups that return at least one deal count toward the monthly limit.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedDealsRequest"},"examples":{"entityName":{"summary":"Entity name","value":{"search_string":"JD Properties, LLC","search_state":"FL","is_entity_name":true,"strict_matches_only":false}},"mailingAddress":{"summary":"Mailing address","value":{"search_string":"123 Main St, Miami, FL 33101","is_entity_name":false,"strict_matches_only":true}}}}}},"responses":{"200":{"description":"Portfolio statistics and the linked deals. `results` is empty when nothing matched.","headers":{"X-RateLimit-Limit":{"required":true,"description":"Requests allowed per minute for this key.","schema":{"type":"integer","description":"Requests allowed per minute for this key."}},"X-RateLimit-Remaining":{"required":true,"description":"Requests left in the current one-minute window.","schema":{"type":"integer","description":"Requests left in the current one-minute window."}},"X-Monthly-Limit":{"schema":{"type":"integer","description":"Monthly allowance for this endpoint."}},"X-Monthly-Remaining":{"schema":{"type":"integer","description":"Requests left this calendar month for this endpoint."}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedDealsResponse"}}}},"400":{"description":"The body is not valid JSON or failed validation, a mailing address `search_string` has no letters or digits, or the `x-api-key` header (or `x-user-id` for an enterprise key) is missing.","content":{"application/json":{"example":{"error":"search_state is required when is_entity_name is true or omitted"},"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is invalid or inactive, or the enterprise end user is unknown or inactive.","content":{"application/json":{"example":{"error":"Invalid or inactive API key"},"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not authorized for this endpoint, or there is no active subscription that covers it.","content":{"application/json":{"example":{"error":"No active subscription for this endpoint"},"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"The per-minute limit or the monthly limit for this endpoint was reached.","content":{"application/json":{"example":{"error":"Rate limit exceeded"},"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"example":{"error":"Unexpected server error"},"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"A server-side step exceeded its processing time limit. Safe to retry.","content":{"application/json":{"example":{"error":"Request exceeded the server-side processing time limit. Safe to retry."},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/api-credentials":{"get":{"operationId":"getApiCredentials","tags":["Account management"],"summary":"Get account details","description":"Returns your enterprise account, its per-minute rate limit, the endpoints the key may call, and the plans you can assign to your users. Enterprise keys only, and no usage headers are returned.","security":[{"apiKey":[]}],"responses":{"200":{"description":"The account behind the API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiCredentialsResponse"}}}},"401":{"description":"`API key required` when `x-api-key` is missing, `Invalid API key` when the key is unknown.","content":{"application/json":{"example":{"error":"Invalid API key"},"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`API key is inactive` when the key was deactivated, `Endpoint not authorized for this API key` when `api_credentials` is not in its authorized endpoints.","content":{"application/json":{"example":{"error":"API key is inactive"},"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"example":{"error":"Unexpected server error"},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/api-users":{"get":{"operationId":"getApiUser","tags":["Account management"],"summary":"Get a user and their usage","description":"Returns one end user, their subscriptions, and their request counts for the current calendar month. Enterprise keys only.","security":[{"apiKey":[]}],"parameters":[{"in":"query","name":"user_id","schema":{"type":"string","minLength":1,"description":"Your identifier for the end user.","example":"user_555"},"required":true,"description":"Your identifier for the end user."}],"responses":{"200":{"description":"The user, their subscriptions and their usage this month.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiUsersDetailsResponse"}}}},"400":{"description":"The `user_id` query parameter is missing or empty.","content":{"application/json":{"example":{"error":"user_id query parameter is required"},"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`API key required` when `x-api-key` is missing, `Invalid or inactive API key` when the key is unknown or deactivated.","content":{"application/json":{"example":{"error":"Invalid or inactive API key"},"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not authorized for this endpoint (`api_users` is not in its authorized endpoints).","content":{"application/json":{"example":{"error":"Endpoint not authorized for this API key"},"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No user with that `user_id` under this key.","content":{"application/json":{"example":{"error":"User not found"},"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"example":{"error":"Unexpected server error"},"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createApiUser","tags":["Account management"],"summary":"Create a user","description":"Registers an end user under your key. New users start active, and need a subscription from `POST /v1/api-user-subscriptions` before they can call the data endpoints. Enterprise keys only.","security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiUsersCreateRequest"}}}},"responses":{"201":{"description":"The user was created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiUsersUser"}}}},"400":{"description":"The body is not valid JSON (`Invalid request body`), or a field failed validation.","content":{"application/json":{"example":{"error":"user_id is required"},"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`API key required` when `x-api-key` is missing, `Invalid or inactive API key` when the key is unknown or deactivated.","content":{"application/json":{"example":{"error":"Invalid or inactive API key"},"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not authorized for this endpoint (`api_users` is not in its authorized endpoints).","content":{"application/json":{"example":{"error":"Endpoint not authorized for this API key"},"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"A user with this `user_id` already exists under this key.","content":{"application/json":{"example":{"error":"User already exists"},"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"example":{"error":"Unexpected server error"},"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateApiUser","tags":["Account management"],"summary":"Activate or deactivate a user","description":"Deactivating a user also deactivates all of their subscriptions. Reactivating a user leaves their subscriptions inactive. Enterprise keys only.","security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiUsersUpdateRequest"}}}},"responses":{"200":{"description":"The user was updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiUsersUpdateResponse"}}}},"400":{"description":"The body is not valid JSON (`Invalid request body`), or a field failed validation.","content":{"application/json":{"example":{"error":"user_id is required"},"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`API key required` when `x-api-key` is missing, `Invalid or inactive API key` when the key is unknown or deactivated.","content":{"application/json":{"example":{"error":"Invalid or inactive API key"},"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not authorized for this endpoint (`api_users` is not in its authorized endpoints).","content":{"application/json":{"example":{"error":"Endpoint not authorized for this API key"},"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No user with that `user_id` under this key.","content":{"application/json":{"example":{"error":"User not found"},"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"example":{"error":"Unexpected server error"},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/api-user-subscriptions":{"post":{"operationId":"createApiUserSubscription","tags":["Account management"],"summary":"Assign a plan to a user","description":"Creates an active subscription for an active user. Subscriptions stack: a user with several active subscriptions gets the sum of their plan limits. Enterprise keys only.","security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiUserSubscriptionsCreateRequest"}}}},"responses":{"201":{"description":"The subscription was created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiUserSubscriptionsCreateResponse"}}}},"400":{"description":"The body is not valid JSON (`Invalid request body`), or a field failed validation.","content":{"application/json":{"example":{"error":"plan_id is required"},"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`API key required` when `x-api-key` is missing, `Invalid or inactive API key` when the key is unknown or deactivated.","content":{"application/json":{"example":{"error":"Invalid or inactive API key"},"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not authorized for this endpoint (`api_user_subscriptions` is not in its authorized endpoints).","content":{"application/json":{"example":{"error":"Endpoint not authorized for this API key"},"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`User not found or inactive. Please create or activate user first via /api-users` when the user is missing or inactive, `Plan not found or does not belong to this credential` when the plan is not one of your plans.","content":{"application/json":{"example":{"error":"Plan not found or does not belong to this credential"},"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"example":{"error":"Unexpected server error"},"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateApiUserSubscription","tags":["Account management"],"summary":"Activate or deactivate a subscription","description":"Changes whether a subscription counts toward its user's limits. Enterprise keys only.","security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiUserSubscriptionsUpdateRequest"}}}},"responses":{"200":{"description":"The subscription after the update.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiUserSubscriptionsSubscription"}}}},"400":{"description":"The body is not valid JSON (`Invalid request body`), or a field failed validation.","content":{"application/json":{"example":{"error":"active status is required"},"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`API key required` when `x-api-key` is missing, `Invalid or inactive API key` when the key is unknown or deactivated.","content":{"application/json":{"example":{"error":"Invalid or inactive API key"},"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not authorized for this endpoint (`api_user_subscriptions` is not in its authorized endpoints).","content":{"application/json":{"example":{"error":"Endpoint not authorized for this API key"},"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The subscription does not exist under this key, or its user is inactive.","content":{"application/json":{"example":{"error":"Subscription not found or user is inactive"},"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"example":{"error":"Unexpected server error"},"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"AutocompleteRequest":{"type":"object","properties":{"search_string":{"type":"string","minLength":3,"description":"The partial address or location to search for.","example":"123 Main"}},"required":["search_string"]},"BuyerSearchRequest":{"type":"object","properties":{"address":{"description":"Full street address of the subject property, in the same format `/v1/autocomplete` returns. Preferred over coordinates: we resolve it to the property, which keeps repeat detection and usage tracking accurate. When both are sent, the address wins, and the coordinates are used only if the address cannot be resolved.","example":"123 Main St, Charleston, SC 29407","type":["string","null"]},"latitude":{"description":"Latitude of the subject, in decimal degrees. Send it together with `longitude`. Required when no `address` is sent.","example":32.7765,"anyOf":[{"type":"number","minimum":-90,"maximum":90},{"type":"null"}]},"longitude":{"description":"Longitude of the subject, in decimal degrees. Send it together with `latitude`. Required when no `address` is sent.","example":-79.9311,"anyOf":[{"type":"number","minimum":-180,"maximum":180},{"type":"null"}]},"property_types":{"description":"Property types to include: `SFR` single family, `MFR` multifamily, `CONDO` condominium, `MOBILE` mobile or manufactured home, `LAND` vacant land, `OTHER` commercial and other properties. Omitted, null or empty means `SFR`, `CONDO`, `MOBILE` and `MFR`, as in the app.","default":["SFR","CONDO","MOBILE","MFR"],"example":["SFR"],"anyOf":[{"type":"array","items":{"type":"string","enum":["SFR","MFR","LAND","CONDO","MOBILE","OTHER"]}},{"type":"null"}]},"flipper_weight":{"description":"Ignored. Use `buyer_types` to get only flippers or only landlords.","deprecated":true,"type":["number","null"]},"buyer_types":{"description":"Buyer types to include. Omitted, null or empty means both.","default":["flipper","landlord"],"example":["flipper"],"anyOf":[{"type":"array","items":{"type":"string","enum":["flipper","landlord"]}},{"type":"null"}]},"radius_miles":{"description":"How far from the subject to look, in miles, up to 10. Omitted or null means 2 miles.","default":2,"example":1,"anyOf":[{"type":"number","exclusiveMinimum":0,"maximum":10},{"type":"null"}]},"lookback_years":{"description":"How far back to look for purchases, in years, up to 5. Fractions work: `0.25` is 3 months. Omitted or null means 2 years.","default":2,"example":1,"anyOf":[{"type":"number","exclusiveMinimum":0,"maximum":5},{"type":"null"}]},"min_bedrooms":{"description":"Fewest bedrooms on the buyer's property. Omitted or null means no minimum.","example":2,"anyOf":[{"type":"integer","minimum":0,"maximum":100},{"type":"null"}]},"max_bedrooms":{"description":"Most bedrooms on the buyer's property. Omitted or null means no maximum.","example":4,"anyOf":[{"type":"integer","minimum":0,"maximum":100},{"type":"null"}]},"min_bathrooms":{"description":"Fewest bathrooms on the buyer's property. Omitted or null means no minimum.","example":1.5,"anyOf":[{"type":"number","minimum":0,"maximum":100},{"type":"null"}]},"max_bathrooms":{"description":"Most bathrooms on the buyer's property. Omitted or null means no maximum.","example":3,"anyOf":[{"type":"number","minimum":0,"maximum":100},{"type":"null"}]},"min_purchase_price":{"description":"Lowest price, in dollars, the buyer paid for the property. Omitted or null means no minimum.","example":100000,"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"max_purchase_price":{"description":"Highest price, in dollars, the buyer paid for the property. Omitted or null means no maximum.","example":500000,"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"hide_non_arms_length":{"description":"Leaves out purchases that were not made on the open market, such as transfers between relatives. Omitted or null means `true`.","default":true,"type":["boolean","null"]},"hide_hedge_fund":{"description":"Leaves out large institutional landlords. Omitted or null means `true`.","default":true,"type":["boolean","null"]},"hide_no_phone":{"description":"Leaves out buyers without a phone number after skiptracing. Omitted or null means `false`.","default":false,"type":["boolean","null"]},"create_deal":{"description":"Creates the deal for the searched property in your CRM and attaches the buyers found, the same as a search in the app. Searching the same address again reuses its deal. Only applies to a search by `address`. Omitted or null means `true`; send `false` to skip it.","default":true,"type":["boolean","null"]},"async":{"description":"When true, the request returns `202` with a `search_id` right away and the search runs in the background. Get the outcome from `GET /v1/buyer-search` or `webhook_url`.","default":false,"type":["boolean","null"]},"webhook_url":{"description":"An https URL we POST the outcome to when the search completes or fails. Works in sync and async modes.","example":"https://your-api.com/webhooks/investorbase","anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"webhook_secret":{"description":"Sent back as the `x-webhook-secret` header on webhook calls, so you can verify they came from InvestorBase.","example":"your-secret-value","type":["string","null"]},"results_in_webhook":{"description":"When true, the completed webhook includes the full results array.","default":false,"type":["boolean","null"]}},"description":"Send `address`, or both `latitude` and `longitude`."},"BuyerSearchWebhookCompleted":{"type":"object","properties":{"search_id":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"status":{"type":"string","const":"completed"},"results":{"description":"Only included when the request set `results_in_webhook` to true.","type":"array","items":{"$ref":"#/components/schemas/BuyerSearchResult"}}},"required":["search_id","status"]},"BuyerSearchResult":{"oneOf":[{"$ref":"#/components/schemas/BuyerSearchFlipperResult"},{"$ref":"#/components/schemas/BuyerSearchLandlordResult"}],"type":"object","discriminator":{"propertyName":"buyer_type","mapping":{"flipper":"#/components/schemas/BuyerSearchFlipperResult","landlord":"#/components/schemas/BuyerSearchLandlordResult"}}},"BuyerSearchFlipperResult":{"type":"object","properties":{"buyer_first_name":{"description":"Buyer first name from skiptracing. Null when unknown or suppressed by Do Not Contact lists.","example":"John","type":["string","null"]},"buyer_last_name":{"description":"Buyer last name from skiptracing. Null when unknown or suppressed by Do Not Contact lists.","example":"Doe","type":["string","null"]},"buyer_entity_name":{"description":"Owner name on record, often an LLC.","example":"JD Properties LLC","type":["string","null"]},"buyer_phone_number":{"description":"Wireless phone number. Null when unknown or suppressed by Do Not Contact lists.","example":8435550123,"type":["number","null"]},"buyer_email":{"description":"Email address. Null when unknown or suppressed by Do Not Contact lists.","example":"john@example.com","type":["string","null"]},"address":{"description":"Address of the property this buyer flipped or bought.","example":"123 Investor Way","type":["string","null"]},"bedrooms":{"example":3,"type":["number","null"]},"bathrooms":{"example":2,"type":["number","null"]},"livingsquarefeet":{"description":"Living area in square feet.","example":1500,"type":["number","null"]},"lotsquarefeet":{"description":"Lot size in square feet.","example":6000,"type":["number","null"]},"propertytype":{"example":"Single Family Residence","type":["string","null"]},"latitude":{"example":32.7812,"type":["number","null"]},"longitude":{"example":-79.9426,"type":["number","null"]},"miles_from_subject":{"type":"number","description":"Distance from the subject in miles, rounded to two decimals.","example":1.2},"smart_match":{"type":"boolean","description":"Whether this buyer is one of the strongest matches for the subject property. Same signal the app shows as a SmartMatch badge.","example":true},"smart_match_rank":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Position of this buyer in the SmartMatch ranking, starting at 1 for the best match. Results come back in this order.","example":1},"buyer_type":{"type":"string","const":"flipper"},"flip_sale_transaction_date":{"description":"Date the buyer sold the flipped property.","example":"2023-06-01","type":["string","null"]},"flip_sale_transaction_price":{"example":250000,"type":["number","null"]},"flip_purchase_transaction_date":{"description":"Date the buyer bought the property they flipped.","example":"2022-12-01","type":["string","null"]},"flip_purchase_transaction_price":{"example":150000,"type":["number","null"]},"flip_purchase_method":{"example":"Financed","type":["string","null"]},"rental_purchase_transaction_date":{"type":"null"},"rental_purchase_transaction_price":{"type":"null"},"rental_purchase_method":{"type":"null"}},"required":["buyer_first_name","buyer_last_name","buyer_entity_name","buyer_phone_number","buyer_email","address","bedrooms","bathrooms","livingsquarefeet","lotsquarefeet","propertytype","latitude","longitude","miles_from_subject","smart_match","smart_match_rank","buyer_type","flip_sale_transaction_date","flip_sale_transaction_price","flip_purchase_transaction_date","flip_purchase_transaction_price","flip_purchase_method","rental_purchase_transaction_date","rental_purchase_transaction_price","rental_purchase_method"]},"BuyerSearchLandlordResult":{"type":"object","properties":{"buyer_first_name":{"description":"Buyer first name from skiptracing. Null when unknown or suppressed by Do Not Contact lists.","example":"John","type":["string","null"]},"buyer_last_name":{"description":"Buyer last name from skiptracing. Null when unknown or suppressed by Do Not Contact lists.","example":"Doe","type":["string","null"]},"buyer_entity_name":{"description":"Owner name on record, often an LLC.","example":"JD Properties LLC","type":["string","null"]},"buyer_phone_number":{"description":"Wireless phone number. Null when unknown or suppressed by Do Not Contact lists.","example":8435550123,"type":["number","null"]},"buyer_email":{"description":"Email address. Null when unknown or suppressed by Do Not Contact lists.","example":"john@example.com","type":["string","null"]},"address":{"description":"Address of the property this buyer flipped or bought.","example":"123 Investor Way","type":["string","null"]},"bedrooms":{"example":3,"type":["number","null"]},"bathrooms":{"example":2,"type":["number","null"]},"livingsquarefeet":{"description":"Living area in square feet.","example":1500,"type":["number","null"]},"lotsquarefeet":{"description":"Lot size in square feet.","example":6000,"type":["number","null"]},"propertytype":{"example":"Single Family Residence","type":["string","null"]},"latitude":{"example":32.7812,"type":["number","null"]},"longitude":{"example":-79.9426,"type":["number","null"]},"miles_from_subject":{"type":"number","description":"Distance from the subject in miles, rounded to two decimals.","example":1.2},"smart_match":{"type":"boolean","description":"Whether this buyer is one of the strongest matches for the subject property. Same signal the app shows as a SmartMatch badge.","example":true},"smart_match_rank":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Position of this buyer in the SmartMatch ranking, starting at 1 for the best match. Results come back in this order.","example":1},"buyer_type":{"type":"string","const":"landlord"},"flip_sale_transaction_date":{"type":"null"},"flip_sale_transaction_price":{"type":"null"},"flip_purchase_transaction_date":{"type":"null"},"flip_purchase_transaction_price":{"type":"null"},"flip_purchase_method":{"type":"null"},"rental_purchase_transaction_date":{"description":"Date the landlord bought the rental.","example":"2024-03-15","type":["string","null"]},"rental_purchase_transaction_price":{"example":310000,"type":["number","null"]},"rental_purchase_method":{"example":"Cash Purchase","type":["string","null"]}},"required":["buyer_first_name","buyer_last_name","buyer_entity_name","buyer_phone_number","buyer_email","address","bedrooms","bathrooms","livingsquarefeet","lotsquarefeet","propertytype","latitude","longitude","miles_from_subject","smart_match","smart_match_rank","buyer_type","flip_sale_transaction_date","flip_sale_transaction_price","flip_purchase_transaction_date","flip_purchase_transaction_price","flip_purchase_method","rental_purchase_transaction_date","rental_purchase_transaction_price","rental_purchase_method"]},"BuyerSearchWebhookFailed":{"type":"object","properties":{"search_id":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"status":{"type":"string","const":"failed"},"error":{"type":"string"}},"required":["search_id","status","error"]},"RetailCompsRequest":{"type":"object","properties":{"address":{"description":"Full street address of the subject property. Required.","example":"123 Main St, Charleston, SC 29407","type":["string","null"]},"max_radius_miles":{"description":"Maximum distance from the subject property, in miles.","example":2,"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"max_days_back":{"description":"How many days back to look for sales, for example 90, 180 or 365.","type":["number","null"]},"living_square_feet_min":{"description":"Minimum interior living area, in square feet.","type":["number","null"]},"living_square_feet_max":{"description":"Maximum interior living area, in square feet.","type":["number","null"]},"bedrooms_min":{"description":"Minimum number of bedrooms.","type":["number","null"]},"bedrooms_max":{"description":"Maximum number of bedrooms. Must not be lower than `bedrooms_min`.","type":["number","null"]},"bathrooms_min":{"description":"Minimum number of bathrooms.","type":["number","null"]},"bathrooms_max":{"description":"Maximum number of bathrooms.","type":["number","null"]}}},"AnalyticsSearchRequest":{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude of the search center, in decimal degrees.","example":32.7765},"longitude":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude of the search center, in decimal degrees.","example":-79.9311},"property_types":{"description":"Property types to include: `SFR` single family, `MFR` multifamily, `CONDO` condominium, `MOBILE` mobile or manufactured home, `LAND` vacant land, `OTHER` commercial and other properties. Omitted, null or empty means `SFR`.","default":["SFR"],"example":["SFR"],"anyOf":[{"type":"array","items":{"type":"string","enum":["SFR","MFR","LAND","CONDO","MOBILE","OTHER"]}},{"type":"null"}]},"flipper_weight":{"description":"Target share of results that are flippers: `1` returns only flippers and `0` only landlords. Values outside 0 to 1 are clamped. Omitted or null means `0.5`.","default":0.5,"example":0.7,"type":["number","null"]}},"required":["latitude","longitude"]},"AnalyticsSummaryRequest":{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude of the search center, in decimal degrees.","example":32.7765},"longitude":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude of the search center, in decimal degrees.","example":-79.9311},"property_types":{"description":"Property types to include: `SFR` single family, `MFR` multifamily, `CONDO` condominium, `MOBILE` mobile or manufactured home, `LAND` vacant land, `OTHER` commercial and other properties. Omitted, null or empty means `SFR`.","default":["SFR"],"example":["SFR"],"anyOf":[{"type":"array","items":{"type":"string","enum":["SFR","MFR","LAND","CONDO","MOBILE","OTHER"]}},{"type":"null"}]},"lookback_months":{"description":"Months of transaction history to include.","default":24,"example":24,"type":"integer","minimum":1,"maximum":60},"metrics_radius_mi":{"description":"Radius in miles for `flipper_metrics` and `landlord_metrics`. Values below 0.1 are treated as 0.1. `radius_counts` always covers 1, 2, 5 and 10 miles.","default":2,"example":2,"type":"number","exclusiveMinimum":0,"maximum":10}},"required":["latitude","longitude"]},"InvestorCompsRequest":{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude of the subject property, in decimal degrees.","example":32.7765},"longitude":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude of the subject property, in decimal degrees.","example":-79.9311},"property_types":{"description":"Property types to include: `SFR` single family, `MFR` multifamily, `CONDO` condominium, `MOBILE` mobile or manufactured home, `LAND` vacant land, `OTHER` commercial and other properties. Omitted, null or empty means `SFR`.","default":["SFR"],"example":["SFR"],"anyOf":[{"type":"array","items":{"type":"string","enum":["SFR","MFR","LAND","CONDO","MOBILE","OTHER"]}},{"type":"null"}]},"subject_property_details":{"description":"Describe the subject property to get ranked comps. Every field is optional: send what you know, even `{}`. When this object is omitted, results are not ranked.","anyOf":[{"type":"object","properties":{"bedrooms":{"description":"Bedrooms in the subject property.","example":3,"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"bathrooms":{"description":"Bathrooms in the subject property.","example":2,"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"square_feet":{"description":"Living area of the subject property, in square feet.","example":1500,"anyOf":[{"type":"number","minimum":0},{"type":"null"}]}}},{"type":"null"}]}},"required":["latitude","longitude"]},"LinkedDealsRequest":{"type":"object","properties":{"search_string":{"type":"string","minLength":1,"description":"The buyer's entity name, or their full mailing address as one string. For an address, pass the `address` value returned by `/v1/autocomplete` for the best match.","example":"JD Properties, LLC"},"search_state":{"description":"Two-letter US state code of the entity. Required when `is_entity_name` is true or omitted, ignored for mailing address searches.","example":"FL","type":["string","null"]},"is_entity_name":{"description":"`true` when `search_string` is an entity or owner name, `false` when it is a mailing address.","default":true,"type":["boolean","null"]},"strict_matches_only":{"description":"`true` matches only on the dimension you searched. `false` also follows the buyer's other key (their mailing address for a name search, their name for an address search), which returns more deals with a higher risk of false positives.","default":true,"type":["boolean","null"]}},"required":["search_string"]},"ApiUsersCreateRequest":{"type":"object","properties":{"user_id":{"type":"string","minLength":1,"description":"Your own identifier for the end user. Send the same value as `x-user-id` on data requests.","example":"user_555"}},"required":["user_id"]},"ApiUsersUpdateRequest":{"type":"object","properties":{"user_id":{"type":"string","minLength":1,"description":"Your own identifier for the end user. Send the same value as `x-user-id` on data requests.","example":"user_555"},"active":{"type":"boolean","description":"`false` deactivates the user and every one of their subscriptions. `true` reactivates the user only; reactivate subscriptions through `PATCH /v1/api-user-subscriptions`.","example":false}},"required":["user_id","active"]},"ApiUserSubscriptionsCreateRequest":{"type":"object","properties":{"user_id":{"type":"string","minLength":1,"description":"Your identifier for an active end user.","example":"user_555"},"plan_id":{"type":"string","minLength":1,"description":"The plan to assign, taken from `available_plans` in `GET /v1/api-credentials`.","example":"c9f0f895-fb98-4b91-9f6a-0b8e3d7e2a11"}},"required":["user_id","plan_id"]},"ApiUserSubscriptionsUpdateRequest":{"type":"object","properties":{"subscription_id":{"type":"string","minLength":1,"description":"The `id` returned when the subscription was created.","example":"8f14e45f-ceea-4671-9c3b-2f1d6a1e0b7a"},"active":{"type":"boolean","description":"`true` reactivates the subscription, `false` deactivates it.","example":false}},"required":["subscription_id","active"]},"AutocompleteResult":{"type":"object","properties":{"address":{"example":"123 Main St, Charleston, SC 29407","type":["string","null"]},"latitude":{"example":32.7765,"type":["number","null"]},"longitude":{"example":-79.9311,"type":["number","null"]}},"required":["address","latitude","longitude"],"additionalProperties":false},"Error":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, written for the developer reading the response."}},"required":["error"],"additionalProperties":false},"BuyerSearchPendingResponse":{"type":"object","properties":{"search_id":{"type":"string","description":"Pass it to `GET /v1/buyer-search` to fetch the results.","example":"550e8400-e29b-41d4-a716-446655440000"},"status":{"type":"string","const":"pending"}},"required":["search_id","status"],"additionalProperties":false},"BuyerSearchAddressNotFoundError":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","const":"ADDRESS_NOT_FOUND"}},"required":["error","code"],"additionalProperties":false},"BuyerSearchLimitError":{"type":"object","properties":{"error":{"type":"string"},"reason":{"description":"Why the shared monthly buyer search pool refused the search, for example `skiptrace_limit_exceeded` or `trial_skiptrace_limit_exceeded`. Only sent to subscriber keys.","type":["string","null"]}},"required":["error"],"additionalProperties":false},"RetailCompsResponse":{"type":"object","properties":{"subject":{"$ref":"#/components/schemas/RetailCompsSubject"},"comps":{"type":"array","items":{"$ref":"#/components/schemas/RetailCompsComparable"},"description":"Comparable arm's length sales, at most 10."}},"required":["subject","comps"],"additionalProperties":false},"RetailCompsSubject":{"type":"object","properties":{"address":{"type":"string","description":"Full address of the property.","example":"123 Main St, Charleston, SC 29407"},"city":{"type":"string","example":"Charleston"},"state":{"type":"string","description":"Two letter state code.","example":"SC"},"zip":{"type":"string","example":"29407"},"bedrooms":{"type":"number","example":3},"bathrooms":{"type":"number","example":2},"year_built":{"type":"number","description":"Year the property was built. 0 when unknown.","example":1950},"living_square_feet":{"type":"number","description":"Interior living area, in square feet. 0 when unknown.","example":1500},"lot_square_feet":{"type":"number","description":"Lot size, in square feet. 0 when unknown.","example":5000},"property_type":{"type":"string","description":"Detailed property type.","example":"Single Family Residence"},"latitude":{"type":"number","example":32.7765},"longitude":{"type":"number","example":-79.9311},"last_sale_date":{"description":"Date of the last sale.","example":"2020-01-15","type":["string","null"]},"last_sale_price":{"type":"number","description":"Price of the last sale, in dollars. 0 when unknown.","example":500000},"owner_names":{"type":"array","items":{"type":"string"},"description":"Current owner names.","example":["John Owner","Jane Owner"]}},"required":["address","city","state","zip","bedrooms","bathrooms","year_built","living_square_feet","lot_square_feet","property_type","latitude","longitude","last_sale_date","last_sale_price","owner_names"],"additionalProperties":false,"description":"The subject property."},"RetailCompsComparable":{"type":"object","properties":{"address":{"type":"string","description":"Full address of the property.","example":"123 Main St, Charleston, SC 29407"},"city":{"type":"string","example":"Charleston"},"state":{"type":"string","description":"Two letter state code.","example":"SC"},"zip":{"type":"string","example":"29407"},"bedrooms":{"type":"number","example":3},"bathrooms":{"type":"number","example":2},"year_built":{"type":"number","description":"Year the property was built. 0 when unknown.","example":1950},"living_square_feet":{"type":"number","description":"Interior living area, in square feet. 0 when unknown.","example":1500},"lot_square_feet":{"type":"number","description":"Lot size, in square feet. 0 when unknown.","example":5000},"property_type":{"type":"string","description":"Detailed property type.","example":"Single Family Residence"},"latitude":{"type":"number","example":32.7765},"longitude":{"type":"number","example":-79.9311},"distance":{"type":"number","description":"Distance from the subject property, in miles.","example":0.05},"last_sale_date":{"description":"Date of the last sale.","example":"2023-05-20","type":["string","null"]},"last_sale_amount":{"description":"Last sale price in dollars, or the MLS sold price when the sale price is unknown.","example":510000,"type":["number","null"]}},"required":["address","city","state","zip","bedrooms","bathrooms","year_built","living_square_feet","lot_square_feet","property_type","latitude","longitude","distance","last_sale_date","last_sale_amount"],"additionalProperties":false,"description":"A comparable recent sale."},"RetailCompsError":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, written for the developer reading the response."},"code":{"description":"Machine readable reason, present when the address or the property could not be evaluated.","type":"string","enum":["INVALID_ADDRESS","LOW_ADDRESS_CONFIDENCE","NON_RESIDENTIAL_PROPERTY_TYPE","INSUFFICIENT_COMPARABLE_SALES"]}},"required":["error"],"additionalProperties":false},"AnalyticsSearchResult":{"oneOf":[{"$ref":"#/components/schemas/AnalyticsSearchFlipperResult"},{"$ref":"#/components/schemas/AnalyticsSearchLandlordResult"}],"type":"object","discriminator":{"propertyName":"buyer_type","mapping":{"flipper":"#/components/schemas/AnalyticsSearchFlipperResult","landlord":"#/components/schemas/AnalyticsSearchLandlordResult"}}},"AnalyticsSearchFlipperResult":{"type":"object","properties":{"buyer_type":{"type":"string","const":"flipper"},"address":{"description":"Street name, city, state and zip. The house number is omitted.","example":"Investor Way, Columbia, SC 29201","type":["string","null"]},"bedrooms":{"description":"Number of bedrooms.","example":3,"type":["number","null"]},"bathrooms":{"description":"Number of bathrooms.","example":2,"type":["number","null"]},"livingsquarefeet":{"description":"Interior living area in square feet.","example":1500,"type":["number","null"]},"lotsquarefeet":{"description":"Lot size in square feet.","example":6000,"type":["number","null"]},"propertytype":{"description":"Detailed property type.","example":"Single Family Residence","type":["string","null"]},"latitude":{"description":"Approximate latitude. An offset of up to a few hundred feet is applied.","example":34.012,"type":["number","null"]},"longitude":{"description":"Approximate longitude. An offset of up to a few hundred feet is applied.","example":-81.008,"type":["number","null"]},"miles_from_subject":{"type":"number","description":"Distance from the search center in miles, rounded to two decimals.","example":1.2},"flip_sale_transaction_date":{"description":"Date the flipper sold the property.","example":"2025-06-01","type":["string","null"]},"flip_sale_transaction_price":{"description":"Price the flipper sold the property for (ARV), in dollars.","example":250000,"type":["number","null"]},"flip_purchase_transaction_date":{"description":"Date the flipper bought the property.","example":"2024-12-01","type":["string","null"]},"flip_purchase_transaction_price":{"description":"Price the flipper paid for the property, in dollars.","example":150000,"type":["number","null"]},"rental_purchase_transaction_date":{"type":"null"},"rental_purchase_transaction_price":{"type":"null"}},"required":["buyer_type","address","bedrooms","bathrooms","livingsquarefeet","lotsquarefeet","propertytype","latitude","longitude","miles_from_subject","flip_sale_transaction_date","flip_sale_transaction_price","flip_purchase_transaction_date","flip_purchase_transaction_price","rental_purchase_transaction_date","rental_purchase_transaction_price"],"additionalProperties":false,"description":"A property bought and resold by a flipper."},"AnalyticsSearchLandlordResult":{"type":"object","properties":{"buyer_type":{"type":"string","const":"landlord"},"address":{"description":"Street name, city, state and zip. The house number is omitted.","example":"Investor Way, Columbia, SC 29201","type":["string","null"]},"bedrooms":{"description":"Number of bedrooms.","example":3,"type":["number","null"]},"bathrooms":{"description":"Number of bathrooms.","example":2,"type":["number","null"]},"livingsquarefeet":{"description":"Interior living area in square feet.","example":1500,"type":["number","null"]},"lotsquarefeet":{"description":"Lot size in square feet.","example":6000,"type":["number","null"]},"propertytype":{"description":"Detailed property type.","example":"Single Family Residence","type":["string","null"]},"latitude":{"description":"Approximate latitude. An offset of up to a few hundred feet is applied.","example":34.012,"type":["number","null"]},"longitude":{"description":"Approximate longitude. An offset of up to a few hundred feet is applied.","example":-81.008,"type":["number","null"]},"miles_from_subject":{"type":"number","description":"Distance from the search center in miles, rounded to two decimals.","example":1.2},"flip_sale_transaction_date":{"type":"null"},"flip_sale_transaction_price":{"type":"null"},"flip_purchase_transaction_date":{"type":"null"},"flip_purchase_transaction_price":{"type":"null"},"rental_purchase_transaction_date":{"description":"Date the landlord bought the property.","example":"2025-03-15","type":["string","null"]},"rental_purchase_transaction_price":{"description":"Price the landlord paid for the property, in dollars.","example":180000,"type":["number","null"]}},"required":["buyer_type","address","bedrooms","bathrooms","livingsquarefeet","lotsquarefeet","propertytype","latitude","longitude","miles_from_subject","flip_sale_transaction_date","flip_sale_transaction_price","flip_purchase_transaction_date","flip_purchase_transaction_price","rental_purchase_transaction_date","rental_purchase_transaction_price"],"additionalProperties":false,"description":"A property bought and held as a rental by a landlord."},"AnalyticsSearchLimitError":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, written for the developer reading the response."},"reason":{"description":"Sent when a subscriber key has used its monthly analytics search allowance. Machine readable, for example `unskiptrace_limit_exceeded`.","type":["string","null"]}},"required":["error"],"additionalProperties":false},"AnalyticsSummaryResponse":{"type":"object","properties":{"radius_counts":{"type":"object","properties":{"1mi":{"$ref":"#/components/schemas/AnalyticsSummaryRadiusBucket"},"2mi":{"$ref":"#/components/schemas/AnalyticsSummaryRadiusBucket"},"5mi":{"$ref":"#/components/schemas/AnalyticsSummaryRadiusBucket"},"10mi":{"$ref":"#/components/schemas/AnalyticsSummaryRadiusBucket"}},"required":["1mi","2mi","5mi","10mi"],"additionalProperties":false,"description":"Every qualifying transaction within each radius over `lookback_months`."},"flipper_metrics":{"$ref":"#/components/schemas/AnalyticsSummaryFlipperMetrics"},"landlord_metrics":{"$ref":"#/components/schemas/AnalyticsSummaryLandlordMetrics"}},"required":["radius_counts","flipper_metrics","landlord_metrics"],"additionalProperties":false},"AnalyticsSummaryRadiusBucket":{"type":"object","properties":{"flips":{"type":"integer","description":"Flip transactions within this radius.","example":12},"rentals":{"type":"integer","description":"Rental acquisitions within this radius.","example":20}},"required":["flips","rentals"],"additionalProperties":false},"AnalyticsSummaryFlipperMetrics":{"type":"object","properties":{"count":{"type":"integer","description":"Flips in the cleaned sample within `metrics_radius_mi`.","example":12},"price_avg":{"type":"number","description":"Mean purchase price in dollars.","example":185000},"price_low":{"type":"number","description":"33rd percentile purchase price in dollars.","example":155000},"price_high":{"type":"number","description":"67th percentile purchase price in dollars.","example":210000},"ppsft_avg":{"type":"number","description":"Mean purchase price per square foot.","example":125},"ppsft_low":{"type":"number","description":"33rd percentile purchase price per square foot.","example":105},"ppsft_high":{"type":"number","description":"67th percentile purchase price per square foot.","example":140},"arv_pct_avg":{"type":"number","description":"Mean purchase price as a percentage of the resale price (ARV).","example":72},"arv_pct_low":{"type":"number","description":"33rd percentile of the ARV percentage.","example":65},"arv_pct_high":{"type":"number","description":"67th percentile of the ARV percentage.","example":80}},"required":["count","price_avg","price_low","price_high","ppsft_avg","ppsft_low","ppsft_high","arv_pct_avg","arv_pct_low","arv_pct_high"],"additionalProperties":false},"AnalyticsSummaryLandlordMetrics":{"type":"object","properties":{"count":{"type":"integer","description":"Rental acquisitions in the cleaned sample within `metrics_radius_mi`.","example":20},"price_avg":{"type":"number","description":"Mean purchase price in dollars.","example":185000},"price_low":{"type":"number","description":"33rd percentile purchase price in dollars.","example":155000},"price_high":{"type":"number","description":"67th percentile purchase price in dollars.","example":210000},"ppsft_avg":{"type":"number","description":"Mean purchase price per square foot.","example":125},"ppsft_low":{"type":"number","description":"33rd percentile purchase price per square foot.","example":105},"ppsft_high":{"type":"number","description":"67th percentile purchase price per square foot.","example":140},"aggressive_purchase_count":{"type":"integer","description":"Purchases where the landlord paid more relative to expected rent.","example":8},"moderate_purchase_count":{"type":"integer","description":"Purchases where the landlord paid a typical price relative to expected rent.","example":7},"conservative_purchase_count":{"type":"integer","description":"Purchases where the landlord paid less relative to expected rent.","example":5}},"required":["count","price_avg","price_low","price_high","ppsft_avg","ppsft_low","ppsft_high","aggressive_purchase_count","moderate_purchase_count","conservative_purchase_count"],"additionalProperties":false},"InvestorCompsResult":{"type":"object","properties":{"buyer_type":{"type":"string","enum":["flipper","landlord"],"description":"`flipper` when an investor bought and resold the property, `landlord` when an investor bought it to rent."},"address":{"description":"Full address of the comparable property.","example":"789 Flip St, Columbia, SC 29201","type":["string","null"]},"bedrooms":{"description":"Number of bedrooms.","example":3,"type":["number","null"]},"bathrooms":{"description":"Number of bathrooms.","example":2,"type":["number","null"]},"livingsquarefeet":{"description":"Interior living area in square feet. Null when unknown.","example":1450,"type":["number","null"]},"lotsquarefeet":{"description":"Lot size in square feet. Null when unknown.","example":5000,"type":["number","null"]},"propertytype":{"description":"Detailed property type.","example":"Single Family Residence","type":["string","null"]},"latitude":{"example":34.06,"type":["number","null"]},"longitude":{"example":-81.05,"type":["number","null"]},"miles_from_subject":{"type":"number","description":"Distance from the subject coordinates in miles, rounded to two decimals.","example":0.5},"flip_sale_transaction_date":{"description":"Flips only: date the flipper sold the property.","example":"2025-06-01","type":["string","null"]},"flip_sale_transaction_price":{"description":"Flips only: price the flipper sold the property for.","example":289000,"type":["number","null"]},"flip_purchase_transaction_date":{"description":"Flips only: date the flipper bought the property.","example":"2025-01-15","type":["string","null"]},"flip_purchase_transaction_price":{"description":"Flips only: price the flipper paid for the property.","example":217500,"type":["number","null"]},"rental_purchase_transaction_date":{"description":"Rentals only: date the landlord bought the property.","example":null,"type":["string","null"]},"rental_purchase_transaction_price":{"description":"Rentals only: price the landlord paid for the property.","example":null,"type":["number","null"]},"rank":{"example":1,"type":"integer","description":"Position in the ranking, starting at 1. Only present when `subject_property_details` is sent."},"pricePerSqFt":{"description":"Purchase price divided by living area, rounded to a whole number. 0 when the living area is unknown. Only present when `subject_property_details` is sent.","example":150,"type":"number"}},"required":["buyer_type","address","bedrooms","bathrooms","livingsquarefeet","lotsquarefeet","propertytype","latitude","longitude","miles_from_subject","flip_sale_transaction_date","flip_sale_transaction_price","flip_purchase_transaction_date","flip_purchase_transaction_price","rental_purchase_transaction_date","rental_purchase_transaction_price"],"additionalProperties":false},"LinkedDealsResponse":{"type":"object","properties":{"metadata":{"anyOf":[{"$ref":"#/components/schemas/LinkedDealsMetadata"},{"type":"null"}]},"results":{"type":"array","items":{"$ref":"#/components/schemas/LinkedDealsResult"},"description":"Up to 250 of the buyer's most recent deals."}},"required":["metadata","results"],"additionalProperties":false},"LinkedDealsMetadata":{"type":"object","properties":{"rental_count":{"description":"Rental acquisitions linked to the buyer.","example":8,"type":["number","null"]},"flip_count":{"description":"Flips linked to the buyer.","example":3,"type":["number","null"]},"total_deals":{"description":"All deals linked to the buyer, including any beyond the 250 returned in `results`.","example":11,"type":["number","null"]},"main_property_type":{"description":"Most common property type across the deals. `Unknown` when nothing matched.","example":"Single Family Residence","type":["string","null"]},"estimated_portfolio_value":{"description":"Sum of the estimated values of the rental properties.","example":1850000,"type":["number","null"]},"average_flip_duration":{"description":"Average days between purchase and sale on flips. Null when there are no flips.","example":142,"type":["number","null"]},"average_purchase_arv_percent":{"description":"Average purchase price as a percentage of the sale price (ARV) on flips. Null when there are no flips.","example":72,"type":["number","null"]},"average_purchase_price":{"description":"Average purchase price across flips and rentals.","example":195000,"type":["number","null"]},"average_flip_gross_profit":{"description":"Average sale price minus purchase price on flips. Null when there are no flips.","example":55000,"type":["number","null"]}},"required":["rental_count","flip_count","total_deals","main_property_type","estimated_portfolio_value","average_flip_duration","average_purchase_arv_percent","average_purchase_price","average_flip_gross_profit"],"additionalProperties":false,"description":"Statistics across every deal linked to the buyer."},"LinkedDealsResult":{"type":"object","properties":{"address":{"$ref":"#/components/schemas/LinkedDealsAddress"},"latitude":{"example":25.76,"type":["number","null"]},"longitude":{"example":-80.19,"type":["number","null"]},"bedrooms":{"description":"Number of bedrooms.","example":3,"type":["number","null"]},"bathrooms":{"description":"Number of bathrooms.","example":2,"type":["number","null"]},"livingsquarefeet":{"description":"Interior living area in square feet.","example":1500,"type":["number","null"]},"lotsquarefeet":{"description":"Lot size in square feet.","example":6000,"type":["number","null"]},"unitscount":{"description":"Number of units.","example":1,"type":["number","null"]},"yearbuilt":{"description":"Year the property was built.","example":1985,"type":["number","null"]},"propertytype":{"description":"Detailed property type.","example":"Single Family Residence","type":["string","null"]},"deal_type":{"description":"`rental` for a rental acquisition, `flip` for a flip.","example":"rental","type":["string","null"]}},"required":["address","latitude","longitude","bedrooms","bathrooms","livingsquarefeet","lotsquarefeet","unitscount","yearbuilt","propertytype","deal_type"],"additionalProperties":false},"LinkedDealsAddress":{"type":"object","properties":{"street":{"example":"456 Oak Ave","type":["string","null"]},"city":{"example":"Miami","type":["string","null"]},"state":{"example":"FL","type":["string","null"]},"zip":{"example":"33101","type":["string","null"]}},"required":["street","city","state","zip"],"additionalProperties":false},"ApiCredentialsResponse":{"type":"object","properties":{"account_name":{"type":"string","example":"Acme Corp"},"account_contact_email":{"type":"string","example":"admin@acmecorp.com"},"active":{"type":"boolean","example":true},"rate_limit_per_minute":{"type":"number","description":"Requests per minute this key may send, across all endpoints and all users.","example":1000},"authorized_endpoints":{"type":"array","items":{"type":"string"},"description":"Endpoints this key may call. A key can only call an endpoint listed here.","example":["api_credentials","api_users","api_user_subscriptions","autocomplete","buyer_search"]},"available_plans":{"type":"array","items":{"$ref":"#/components/schemas/ApiCredentialsPlan"},"description":"Plans you can assign to your users."}},"required":["account_name","account_contact_email","active","rate_limit_per_minute","authorized_endpoints","available_plans"],"additionalProperties":false},"ApiCredentialsPlan":{"type":"object","properties":{"plan_id":{"type":"string","description":"Send this as `plan_id` to `POST /v1/api-user-subscriptions`.","example":"c9f0f895-fb98-4b91-9f6a-0b8e3d7e2a11"},"plan_name":{"type":"string","example":"Pro Plan"},"monthly_price_usd":{"type":"number","description":"Monthly price of the plan, in US dollars.","example":99},"autocomplete_limit":{"type":"number","description":"Monthly requests per user to `/v1/autocomplete` from one subscription to this plan.","example":1000},"analytics_search_limit":{"type":"number","description":"Monthly requests per user to `/v1/analytics-search` and, counted separately, to `/v1/analytics-summary` from one subscription to this plan.","example":500},"buyer_search_limit":{"type":"number","description":"Monthly requests per user to `/v1/buyer-search` from one subscription to this plan.","example":100},"investor_comps_limit":{"type":"number","description":"Monthly requests per user to `/v1/investor-comps` from one subscription to this plan.","example":200},"retail_comps_limit":{"type":"number","description":"Monthly requests per user to `/v1/retail-comps` from one subscription to this plan.","example":200}},"required":["plan_id","plan_name","monthly_price_usd","autocomplete_limit","analytics_search_limit","buyer_search_limit","investor_comps_limit","retail_comps_limit"],"additionalProperties":false},"ApiUsersDetailsResponse":{"type":"object","properties":{"user_id":{"type":"string","description":"Your identifier for the end user.","example":"user_555"},"created_at":{"type":"string","format":"date-time","example":"2026-01-15T12:00:00+00:00"},"active":{"type":"boolean","example":true},"subscriptions":{"type":"array","items":{"$ref":"#/components/schemas/ApiUsersSubscription"},"description":"Every subscription the user holds, active or not."},"current_period_usage":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"},"description":"Logged requests for this user since the start of the current calendar month (UTC), keyed by endpoint name. Retail comps and investor comps only count requests that returned results. Endpoints with no requests are absent.","example":{"buyer_search":45,"retail_comps":12}}},"required":["user_id","created_at","active","subscriptions","current_period_usage"],"additionalProperties":false},"ApiUsersSubscription":{"type":"object","properties":{"id":{"type":"string","example":"8f14e45f-ceea-4671-9c3b-2f1d6a1e0b7a"},"plan_id":{"type":"string","example":"c9f0f895-fb98-4b91-9f6a-0b8e3d7e2a11"},"active":{"type":"boolean","example":true},"created_at":{"type":"string","format":"date-time","example":"2026-01-15T12:00:00+00:00"}},"required":["id","plan_id","active","created_at"],"additionalProperties":false},"ApiUsersUser":{"type":"object","properties":{"user_id":{"type":"string","description":"Your identifier for the end user.","example":"user_555"},"created_at":{"type":"string","format":"date-time","example":"2026-01-15T12:00:00+00:00"},"active":{"type":"boolean","example":true}},"required":["user_id","created_at","active"],"additionalProperties":false},"ApiUsersUpdateResponse":{"type":"object","properties":{"success":{"type":"boolean","const":true}},"required":["success"],"additionalProperties":false},"ApiUserSubscriptionsCreateResponse":{"type":"object","properties":{"id":{"type":"string","example":"8f14e45f-ceea-4671-9c3b-2f1d6a1e0b7a"},"created_at":{"type":"string","format":"date-time","example":"2026-01-15T12:00:00+00:00"},"plan_id":{"type":"string","example":"c9f0f895-fb98-4b91-9f6a-0b8e3d7e2a11"},"active":{"type":"boolean","example":true},"user_id":{"type":"string","description":"Your identifier for the end user.","example":"user_555"}},"required":["id","created_at","plan_id","active","user_id"],"additionalProperties":false},"ApiUserSubscriptionsSubscription":{"type":"object","properties":{"id":{"type":"string","example":"8f14e45f-ceea-4671-9c3b-2f1d6a1e0b7a"},"created_at":{"type":"string","format":"date-time","example":"2026-01-15T12:00:00+00:00"},"plan_id":{"type":"string","example":"c9f0f895-fb98-4b91-9f6a-0b8e3d7e2a11"},"active":{"type":"boolean","example":true}},"required":["id","created_at","plan_id","active"],"additionalProperties":false}},"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"x-api-key","description":"Your API key. Subscribers find it under Account → Integrations in InvestorBase. Enterprise integrations receive theirs from InvestorBase."},"userId":{"type":"apiKey","in":"header","name":"x-user-id","description":"Enterprise keys only. Identifies the end user the request is made for, and drives per-user limits and usage tracking. Subscriber keys do not send it."}}}}