Skip trace a person by name and mailing address
const url = 'https://app-api.landinsights.co/api/public/v1/skip-trace/';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"first_name":"John","last_name":"Smith","address":"300 Main St","city":"San Luis","state":"CO","zip":"81152"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://app-api.landinsights.co/api/public/v1/skip-trace/ \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "first_name": "John", "last_name": "Smith", "address": "300 Main St", "city": "San Luis", "state": "CO", "zip": "81152" }'Looks up phone numbers for a person by name and mailing address. Returns up to six phone numbers, each with line type and federal Do Not Call registry status.
To skip trace the owner of a specific Land Insights property, prefer skip_trace_property_owner — it takes a property_id and reads the owner name and mailing address straight from the parcel record, so there is nothing to copy over (and no risk of a typo breaking the match). Use this endpoint when the person comes from somewhere else — your own list, a referral, or a record outside Land Insights.
first_name and last_name are required, plus either zip or both city and state. Including the street address improves match quality. Matching is at the individual level; matched: false means no contact information was found for the given inputs.
Cost: 20 tokens per matched trace. No-match responses cost 0 tokens.
Rate limit: 20 requests per minute per account, shared between both skip-trace endpoints — lower than the rest of the API, because each call queries an upstream data provider with limited capacity.
Authorizations
Section titled “Authorizations ”Request Body required
Section titled “Request Body required ”One-off skip trace by name and mailing address. Name is always
required; the address fields must include either zip or both city and
state. (Tracing a specific property goes through the by-property-ID
endpoint instead, which needs no request body.)
object
Required. The person’s first name.
Required. The person’s last name.
Optional. Street address (e.g. mailing address from the parcel record). Including it improves match quality.
Optional. City. Required together with state when zip is omitted.
Optional. Two-letter state abbreviation (e.g. CO). Required together with city when zip is omitted.
Optional. 5-digit ZIP code. Required when city/state are omitted.
Examples
Owner from a parcel record
{ "first_name": "John", "last_name": "Smith", "address": "300 Main St", "city": "San Luis", "state": "CO", "zip": "81152"}Responses
Section titled “ Responses ”Normalized contact-append result for one person.
object
true when phone numbers were found. false responses return an empty phones list and are not billed.
First name on the matched record, null when no match.
Last name on the matched record, null when no match.
Up to six phone numbers, best match first. Empty when no phones were found.
A phone number found for the traced person.
object
10-digit phone number, digits only (e.g. 3035551234).
Mobile or Landline, null when unknown. Line types are approximate — number portability introduces up to ~10% inaccuracy.
Whether the number appears on the federal Do Not Call registry; null when no DNC data was returned for the number.
Examples
Matched trace
{ "matched": true, "first_name": "John", "last_name": "Smith", "phones": [ { "number": "3035551234", "line_type": "Mobile", "dnc": false }, { "number": "7195555678", "line_type": "Landline", "dnc": true } ]}No match
{ "matched": false, "first_name": null, "last_name": null, "phones": []}Validation error.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, payment_required, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}Missing or invalid credentials.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, payment_required, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}A Pro subscription or higher API tier is required.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, payment_required, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}Authenticated but not permitted.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, payment_required, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}Resource not found.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, payment_required, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}Rate limit exceeded.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, payment_required, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}Internal error.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, payment_required, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}