API Documentation
Complete API reference for integrating our search capabilities into your applications.
Authentication
All customer API requests authenticate with an api_key query or form/body parameter. There is no User-Agent restriction — library defaults (python-requests, curl, etc.) work fine.
https://search-api.dev
How to authenticate
- Pass
api_keyas a GET query parameter or POST field / JSON body field - Most actions also use
action=...on the same base URL - Optional
X-API-Version: v1|v2is accepted and echoed; it does not change behavior today - Per-key rate limits return HTTP
429when exceeded
curl "https://search-api.dev/?api_key=YOUR_API_KEY&phone=1234567890"
Also see the interactive OpenAPI UI at /api-reference and this page at /docs.
Unified Search Endpoint
Search by email, phone, domain, or company on a single endpoint. The API detects the search type from the parameters you send.
GET / or POST /
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | string | Yes | Your API key |
| phone | string | No* | Phone number (requires search:phone scope) |
| string | No* | Email address (requires search:email scope) |
|
| domain | string | No* | Domain name (requires search:domain scope) |
| company | string | No* | Company name (uses search:domain scope; priced like domain search) |
| country | string | No | Optional country filter for company search (e.g. Germany) |
| house_value | boolean | No | Include property value estimates (+$0.0005) |
| extra_info | boolean | No | Include additional enriched data (+$0.0020) |
| carrier_info | boolean | No | Include carrier information (+$0.0005) |
| tlo_enrichment | boolean | No | Include TLO enrichment when name + city + state are available. See TLO Enrichment. |
| recovery_check | boolean | No | Email searches only — verify phones via recovery modules. See Phone Recovery Verification. |
| skip_cache | boolean | No | Bypass cached enrichment / carrier results where supported |
| action | string | No | person_report or verify_identity to reshape the response (see Person Report & Verify) |
* Provide exactly one primary lookup: phone, email, domain, or company.
Example Request
curl "https://search-api.dev/?api_key=YOUR_KEY&phone=%2B11234567890&extra_info=true"
Response Example
{
"found": true,
"data": {
"name": "John Doe",
"dob": "1980-01-01",
"age": 44,
"numbers": [{"number": "+1234567890", "carrier_name": "Verizon Wireless"}],
"emails": ["[email protected]"],
"addresses": ["123 Main St, New York, NY 10001"]
},
"_pricing": {
"base_cost": 0.0025,
"total_cost": 0.0045 }
}
Phone Search
Search for person details using a phone number. Supports enrichment with property values, carrier info, and extra data.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| phone | string | Yes | Phone number (e.g. 1234567890 or +1234567890) |
| house_value | boolean | No | Set to 1 to include Zestimates and property details. |
| extra_info | boolean | No | Set to 1 to include additional data points. |
| carrier_info | boolean | No | Set to 1 to include carrier network information. |
| tlo_enrichment | boolean | No | Set to 1 to include TLO (Telecommunications Lookup) enrichment data. Only charged if enrichment is attempted (requires first name, last name, city, and state). |
search:phone
Email Search
Search for person details using an email address.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| string | Yes | Email address to search. | |
| house_value | boolean | No | Set to 1 to include Zestimates. |
| extra_info | boolean | No | Set to 1 to include additional data. |
| carrier_info | boolean | No | Set to 1 to include carrier network information. |
| tlo_enrichment | boolean | No | Set to 1 to include TLO (Telecommunications Lookup) enrichment data. Only charged if enrichment is attempted (requires first name, last name, city, and state). See TLO Enrichment section for details. |
| recovery_check | boolean | No | Enable Phone Recovery Verification to verify phone numbers associated with email addresses. See Phone Recovery Verification section for details. |
search:email
TLO Enrichment
TLO (Telecommunications Lookup) Enrichment provides comprehensive person data enrichment by matching your search results with additional information from InstantCheckmate. This includes historical data, related persons, criminal records, confirmed phone numbers, and more.
Requirements
TLO enrichment requires the following information to be available from your search results:
- First Name - Required
- Last Name - Required
- City - Required
- State - Required
- Middle Name - Optional (helps narrow down results)
Note: TLO enrichment is only charged if an enrichment request can be made (all required fields are present). If the required fields are missing, the parameter is ignored and no charge is applied.
What TLO Enrichment Provides
Enhanced Data Fields
- Confirmed Phone Numbers - Phone numbers from your dataset that match censored numbers from TLO, with full details (line type, carrier, dates, spam reports)
- Phone Numbers Full - Complete phone number data including censored numbers (with X or *), line types, carriers, first seen dates, and spam reports
- All Names - Historical name variations with first seen/last seen dates
- All DOBs - All known dates of birth with age calculations and date ranges
- Related Persons - Family members and associates with relationship types (spouse, parent, child, sibling, in-law, relative) and sub-types (e.g., "Spouse Widowed", "Parent")
- Criminal Records - Court records including case numbers, crime types, counties, offense codes, and charge dates
- Addresses Structured - Complete structured address data with county information, filling in missing components where possible
- Alternative Names - Additional name variations found in TLO data
Data Matching & Quality
TLO enrichment uses intelligent matching to ensure data accuracy:
- Match Scoring - Uses name, phone, address, and DOB matching with configurable weights
- Minimum Match Score - Only returns data when match confidence is ≥ 50%
- Definite Match - When exact name + last 4 phone digits match, prioritizes your dataset's DOB
- Data Merging - Intelligently merges TLO data with existing data, preserving all original information (carrier info, zestimate, etc.)
- DOB Filtering - Automatically filters out DOBs that are inconsistent with the primary DOB (age difference > 10 years)
Response Example
{
"email": "[email protected]",
"name": "John Doe",
"dob": "1980-01-01",
"age": 44,
"numbers": ["+1234567890", "XXXXXX1234"],
"confirmed_numbers": ["+1234567890"],
"phone_numbers_full": [
{
"number": "+1234567890",
"line_type": "Mobile",
"carrier": "VERIZON WIRELESS",
"date_first_seen": {"date": {"month": 1, "day": 15, "year": 2010}},
"is_spam_report": false
},
{
"number": "XXXXXX1234",
"line_type": "Landline",
"carrier": "AT&T",
"date_first_seen": {"date": {"month": 3, "day": 20, "year": 2005}},
"is_spam_report": false
}
],
"all_names": [
{"name": "John Doe"},
{
"name": "John Michael Doe",
"first": "John",
"middle": "Michael",
"last": "Doe",
"date_first_seen": {"date": {"month": 6, "day": 1, "year": 2008}},
"date_last_seen": {"date": {"month": 12, "day": 31, "year": 2024}}
}
],
"all_dobs": [
{
"dob": "1980-01-01",
"age": 44,
"date": {"month": 1, "day": 1, "year": 1980}
}
],
"related_persons": [
{
"name": "Jane Doe",
"dob": "1982-05-15",
"age": 42,
"relationship": "Spouse",
"sub_type": "Spouse",
"addresses": ["123 Main St, New York, NY 10001"]
}
],
"criminal_records": [
{
"source_name": "NEW YORK COUNTY COURT",
"source_state": "NY",
"case_numbers": ["12345"],
"crimes": [
{
"case_number": "12345",
"crime_type": "Traffic",
"crime_county": "New York",
"offense_code": "SPEEDING",
"charges_filed_date": "2015-06-10"
}
]
}
],
"_pricing": {
"search_cost": 0.0025,
"tlo_enrichment_cost": 0.0030,
"total_cost": 0.0055 }
}
Usage
curl "https://search-api.dev/[email protected]&tlo_enrichment=1"
💡 Tips
- • TLO enrichment works best when you have complete name and location information
- • The system automatically tries multiple address variations if the first attempt doesn't yield a good match
- • Alternative names from your search results are also used for matching
- • All TLO data is merged with your existing data - nothing is replaced, only enhanced
- • Censored phone numbers (with X or *) are marked as "TLO Enriched" in responses
- • Confirmed numbers (matching your dataset) are marked as "SearchAPI + TLO"
Phone Recovery Verification
Phone Recovery Verification verifies phone numbers associated with email addresses by checking various email provider recovery systems. This feature is only available for email searches and helps confirm if a phone number is linked to an email account.
📧 Email Search Only
Phone Recovery Verification is exclusively available for email searches. The recovery_check parameter is ignored for phone and domain searches.
Enabling Recovery Verification
To enable Phone Recovery Verification for an email search, simply add the recovery_check parameter to your request:
Basic Usage:
[email protected]&recovery_check=1
When enabled, phone numbers are automatically extracted from the email search results and verified against the email provider's recovery systems. You don't need to provide phone numbers manually.
Module Order Configuration
You can optionally specify which recovery modules to run and in what order for a specific request. If not specified, the system will automatically use the module order saved in your profile settings.
Specifying Module Order:
You can pass a recovery_modules parameter with the following structure:
recovery_modules[module_order][]=yahoo&recovery_modules[module_order][]=outlook&recovery_modules[module_order][]=icloud
recovery_modules[enabled_modules][]=yahoo&recovery_modules[enabled_modules][]=outlook
Or as JSON in the request body:
{
"recovery_modules": {
"module_order": ["yahoo", "outlook", "icloud"],
"enabled_modules": ["yahoo", "outlook"]
}
}
✅ Automatic Profile Settings
If you don't specify recovery_modules in your request, the system will automatically use the module order and enabled modules configured in your profile settings. You can configure these settings in the dashboard under Recovery Settings.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| string | Yes | Email address to search (required for recovery check) | |
| recovery_check | boolean | No | Enable Phone Recovery Verification. Set to 1 or true to verify phone numbers associated with the email address. |
| recovery_modules | object | No | Optional configuration object with module_order (array of module names in execution order) and enabled_modules (array of enabled module names). If not provided, uses your profile settings. |
How It Works
Phone Recovery Verification works by:
- Performing the email search and extracting phone numbers from the search results automatically
- Processing the email address through multiple email provider recovery systems (iCloud, Outlook, Yahoo, AOL, Xfinity/Comcast, GMX/Mail.com, DoorDash, etc.) in the specified order
- Each provider module checks if the email account has a recovery phone number registered
- If a recovery phone number is found, it's compared against the phone numbers extracted from the search results
- Processing stops on the first successful match, or continues through all enabled modules if no match is found
- Only modules that support the email domain are executed (e.g., Yahoo module only runs for yahoo.com emails)
Supported Email Providers
- • iCloud (all domains)
- • Outlook/Microsoft (all domains)
- • Yahoo (yahoo.com and subdomains)
- • AOL (aol.com and subdomains)
- • Xfinity/Comcast (comcast.com, xfinity.com)
- • GMX/Mail.com (mail.com, gmx.com, etc.)
- • DoorDash (all domains)
Pricing
Phone Recovery Verification is charged per module executed. Each module has its own pricing:
- Doordash: $0.0030
- Gmxmail: $0.0050
- Icloud: $0.0040
- Outlook: $0.0030
- Uber: $0.0030
- Xfinitycomcast: $0.0030
- Yahoo: $0.0060
- Aol: $0.0060
Important: You are only charged for modules that are actually executed. Modules that don't support the email domain are automatically skipped and not charged.
Example Requests
Basic Request (uses profile settings):
curl "https://search-api.dev/[email protected]&recovery_check=1"
Request with Custom Module Order:
curl "https://search-api.dev/[email protected]&recovery_check=1&recovery_modules[module_order][]=yahoo&recovery_modules[module_order][]=outlook&recovery_modules[enabled_modules][]=yahoo&recovery_modules[enabled_modules][]=outlook"
Response Example
{
"found": true,
"data": {
"name": "John Doe",
"email": "[email protected]",
"numbers": ["+1234567890"]
},
"recovery_check": {
"matched": true,
"matched_number": "+1234567890",
"matched_module": "yahoo",
"modules_used": ["yahoo", "icloud", "outlook"],
"cost": 0.003
},
"_pricing": {
"base_cost": 0.0025,
"recovery_check": 0.003,
"total_cost": 0.0055 }
}
Response Fields
| Field | Type | Description |
|---|---|---|
| recovery_check.matched | boolean | Whether a phone number match was found |
| recovery_check.matched_number | string | The phone number that matched (if found) |
| recovery_check.matched_module | string | The email provider module that found the match (e.g., "yahoo", "icloud") |
| recovery_check.modules_used | array | List of modules that were executed (only executed modules are charged) |
| recovery_check.cost | float | Total cost for Phone Recovery Verification (sum of executed modules) |
⚠️ Important Notes
- • Phone numbers are automatically extracted from email search results - you don't need to provide them
- • Processing stops on the first successful match to minimize costs
- • Modules that don't support the email domain are automatically skipped
- • You are only charged for modules that are actually executed
- • If a timeout occurs, you're only charged for modules that completed before the timeout
- • Module order and enabled modules are automatically loaded from your profile settings if not specified in the request
- • Configure your default module order in the dashboard Recovery Settings for consistent behavior across requests
- • Results are cached for 24 hours to prevent duplicate charges for the same email+phone combination
💡 Best Practices
- • Configure your default module order in dashboard Recovery Settings to prioritize faster/cheaper modules
- • Disable modules that don't apply to your use case in your profile settings to reduce costs
- • Use the
recovery_modulesparameter only when you need to override your profile settings for specific requests - • Monitor usage through the dashboard to track Phone Recovery Verification costs
- • The system automatically uses phone numbers from search results, so ensure your email searches return phone number data
search:email
Standalone recovery check
If you already have an email and phone list, call recovery without a full person search:
GET or POST /?action=recovery-check
| Parameter | Type | Required | Description |
|---|---|---|---|
| string | Yes | Email to check | |
| numbers | array or CSV string | Yes | Candidate phone numbers to match against recovery systems |
curl -X POST "https://search-api.dev/?api_key=YOUR_KEY&action=recovery-check" \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","numbers":["+11234567890"]}'
List recovery modules
GET /?action=get_recovery_modules&api_key=YOUR_KEY
Returns available modules and current per-module pricing.
Domain Search
Search for contacts associated with a domain name. Priced at the domain search rate ($4.0000).
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| domain | string | Yes | Domain name (e.g. example.com). |
search:domain
curl "https://search-api.dev/?api_key=YOUR_KEY&domain=example.com"
Company Search
Find people associated with a company name. Same price and similar result shape as domain search ($4.0000). Overly broad terms (e.g. generic words like “company”) are rejected.
| Parameter | Type | Required | Description |
|---|---|---|---|
| company | string | Yes | Company name to search |
| country | string | No | Restrict matches to addresses in this country |
| page | integer | No | Page number (default 1) |
| limit | integer | No | Results per page (default 100) |
search:domain
curl "https://search-api.dev/?api_key=YOUR_KEY&company=Acme%20Corp&country=United%20States"
Carrier Lookup
Look up carrier / line data for a phone number without running a full person search. Charged at the carrier rate ($0.0005) when a successful lookup is returned.
GET /?action=carrier_lookup or POST /?action=carrier_lookup
| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | string | Yes | Your API key |
| action | string | Yes | Must be carrier_lookup |
| phone | string | Yes | Phone number (at least 10 digits) |
| skip_cache | boolean | No | Force a fresh carrier lookup |
curl "https://search-api.dev/?api_key=YOUR_KEY&action=carrier_lookup&phone=%2B11234567890"
{
"success": true,
"data": { "carrier_name": "Verizon Wireless", "line_type": "Mobile" },
"cost": 0.0005}
Person Report & Identity Verify
Run a normal search and optionally reshape the response with action.
Person report
Add action=person_report with your usual email / phone / domain / company lookup. The search runs as usual, then the payload is normalized into a person-report structure.
curl "https://search-api.dev/[email protected]&action=person_report"
Verify identity
Add action=verify_identity. Include name (and your lookup field) to receive a verification-oriented response comparing the search hit to the provided identity fields.
curl "https://search-api.dev/[email protected]&name=John%20Doe&action=verify_identity"
Batch API
Run up to 100 searches in one request. Send a JSON array as the request body. Each item is billed like an individual search (email/phone base + add-ons, or domain/company rate).
POST /?action=batch&api_key=YOUR_KEY
[
{ "email": "[email protected]", "extra_info": true },
{ "phone": "+11234567890", "carrier_info": true },
{ "domain": "example.com" },
{ "company": "Acme Corp", "country": "United States" }
]
curl -X POST "https://search-api.dev/?api_key=YOUR_KEY&action=batch" \
-H "Content-Type: application/json" \
-d '[{"email":"[email protected]"},{"phone":"+11234567890"}]'
Balance is checked against the estimated batch cost before processing. Max batch size: 100.
Billing & Balance
Get Account Balance
GET /?action=get_balance
| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | string | Yes | Your API key |
| action | string | Yes | Must be get_balance |
billing:view
curl "https://search-api.dev/?api_key=YOUR_KEY&action=get_balance"
{
"balance": 123.45
}
Organization Controls
Manage organization-wide API consumption by capping how much balance any individual API key can spend. These endpoints are only available to organization API keys with one of the following scopes: api:usage, api:* , api.manage, api:create, or billing:manage.
Organization-capable endpoints:
- GET /?action=get_balance – retrieve pooled organization balance.
- GET /?action=get_usage_stats – organization-wide usage rollups.
- GET /?action=get_access_logs – audit searches performed by your team.
- GET/POST /?action=batch – batch searches billed against the organization.
- POST /?action=update_api_key_usage – enforce per-key usage caps (described below).
Update API Key Usage & Limits
POST /?action=update_api_key_usage
| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | string | Yes | Organization API key performing the update. |
| target_api_key | string | Yes | API key whose usage/limit should be updated. Must belong to the same organization. |
| max_usage | decimal | No | Maximum dollars this API key can spend. Send null or leave blank to remove the cap. |
| usage | decimal | No | Override the tracked balance consumption for the API key (useful when reconciling external usage systems). |
At least one of usage or max_usage must be provided. If a max usage is configured, searches will be blocked once the tracked usage reaches the cap. Set usage to 0 to reset a key after reconciliation.
curl -X POST "https://search-api.dev/?api_key=ORG_MASTER_KEY&action=update_api_key_usage" \
-H "Content-Type: application/json" \
-d '{
"target_api_key": "TEAM_MEMBERS_KEY",
"max_usage": 25,
"usage": 12.5
}'
{
"success": true,
"target_api_key": "TEAM_MEM...",
"balance_usage": 12.5,
"max_balance_usage": 25
}
Analytics & Usage
Get Usage Statistics
GET /?action=get_usage_stats
| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | string | Yes | Your API key |
| action | string | Yes | Must be get_usage_stats |
curl "https://search-api.dev/?api_key=YOUR_KEY&action=get_usage_stats"
{
"usage_stats": {
"today": { "searches": 12, "cost": 0.03 },
"total": { "searches": 1500, "cost": 3.75 }
}
}
Get Access Logs
GET /?action=get_access_logs
| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | integer | No | Number of logs (default: 100, max: 1000) |
curl "https://search-api.dev/?api_key=YOUR_KEY&action=get_access_logs&limit=50"
Get Cache Statistics
GET /?action=cache_stats
Returns cache-related statistics for the account/key.
Refresh Balance Cache
GET /?action=refresh_balance_cache
Forces a refresh of the cached balance reading for the API key.
Dashboard Bulk Search
For API-key batching, use Batch API. The dashboard bulk uploader is session-authenticated (logged into the web UI), not API-key based.
Upload Bulk Search File
POST /dashboard/bulk-search/upload
Note: Requires a logged-in dashboard session.
| Parameter | Type | Required | Description |
|---|---|---|---|
| file | file | Yes | CSV or text file with one entry per line (max 1000 entries) |
| search_type | string | Yes | One of: phone, email, domain, company |
| house_value | boolean | No | Include property values |
| extra_info | boolean | No | Include extra information |
| carrier_info | boolean | No | Include carrier information |
| tlo_enrichment | boolean | No | Include TLO enrichment data. Only charged if enrichment is attempted (requires first name, last name, city, and state). |
Download Results
GET /dashboard/bulk-search/download/{id}?format={csv|json}
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | integer | Yes | Bulk search job ID |
| format | string | No | Output format: csv or json (default: json) |
Pricing
Email / Phone Search
$0.0025
Per search
Domain / company search: $4.0000
Standalone carrier lookup: $0.0005
Enrichment Add-ons
- Extra Info: +$0.0020
- Zestimate: +$0.0005
- Carrier Info (on search): +$0.0005
- TLO Enrichment: +$0.0030
- Phone Recovery Verification: Variable*
* Phone Recovery Verification pricing varies by module ($0.001 - $0.003 per module). You are only charged for modules that are actually executed. See Phone Recovery Verification section for details.
Note: Failed searches (e.g., insufficient balance, invalid input) are logged but not billed.
API Scopes
API keys can be restricted to specific scopes for security. Available scopes:
Search Scopes
search:phone- Phone number searchessearch:email- Email address searchessearch:domain- Domain and company searchessearch:bulk- Bulk search operationssearch:*- All search operations
Empty scopes on a key mean unrestricted (backward compatible). Dot forms like search.email are also accepted.
API Management Scopes
api:view- View API keysapi:create- Create API keysapi:revoke- Revoke/delete API keysapi:*- Full API key management
Billing Scopes
billing:view- View billing informationbilling:manage- Create and manage paymentsbilling:*- Full billing access
Analytics Scopes
analytics:basic- Basic analytics (usage stats, access logs)analytics:advanced- Advanced analytics (cache stats, exports)analytics:*- Full analytics access
Error Codes
| Code | Description |
|---|---|
| 200 | Success |
| 400 | Bad Request - Invalid parameters |
| 401 | Unauthorized - Invalid or missing API key |
| 402 | Payment Required - Insufficient balance |
| 403 | Forbidden - Insufficient permissions/scope |
| 404 | Not Found - Resource not found |
| 429 | Too Many Requests - Per-key rate limit exceeded |
| 500 | Internal Server Error |
| 502 | Upstream failure (e.g. carrier lookup returned no result) |
Error Response Format
{
"error": "Error message",
"message": "Detailed error description",
"required_permission": "search.phone" // For 403 errors
}