You need to log in to access your API credentials and start using our APIs. Start with our free trial!
Log In & Start Free TrialPerson Search API
Find people by name, company, job title, location, or any criteria you describe
API Endpoint
https://api.nyne.ai/person/search
Try the API Playground
Test the API with our interactive playground to make real requests and see live responses.
Launch Person Search PlaygroundOverview
The Person Search API helps you find people who match specific criteria. Describe who you're looking for in plain English, like "marketing directors at tech startups in Austin" or "CFOs at healthcare companies with 100+ employees", and get back a list of matching people with their contact information.
What You Get
- Contact Information: Verified email addresses and phone numbers for each match
- Professional Details: Current job title, company, and work history
- Social Profiles: LinkedIn, Twitter, and other social media links
- AI-Powered Matching: Results are ranked by how well they match your search criteria
How It Works
Input: Describe who you're looking for in plain English (e.g., "software engineers at Fortune 500 companies in San Francisco")
Output: A list of people matching your criteria with their full contact details
Authentication
All API requests require authentication using your API key and secret. You can authenticate using either HTTP headers (recommended) or query parameters.
X-API-Key: your_api_key_here
X-API-Secret: your_api_secret_here
Rate Limits
API usage is controlled by rate limiting mechanisms to ensure fair usage and system stability:
- Per Minute: 60 requests
- Per Hour: 1000 requests
- Monthly: Varies by plan
Credit Usage
Credits are deducted based on the features used in your search. The total credits consumed depends on your search configuration:
Credit Breakdown by Feature
| Feature | Credits | Description |
|---|---|---|
Fast Search (type: "light") |
1 | Basic search, fastest response (3–40 seconds) |
Pro Search (type: "premium") |
5 | Comprehensive search, best quality (30–300 seconds) |
Smart Ranking (profile_scoring: true) |
1 | AI-powered relevance scoring of results |
Candidate Insights (insights: true) |
1 | AI-generated insights about each result |
Realtime Profiles (high_freshness: true) |
2 | Prioritize recently updated profiles |
| Filter Without Contact Data | 1 | Search without email/phone enrichment |
Enrich Phones (show_phone_numbers: true) |
14 | Include phone numbers in results |
Enrich Emails (show_emails: true) |
2 | Include email addresses in results |
Require Emails (require_emails: true) |
1 | Only return profiles with email addresses |
Require Phones (require_phone_numbers: true) |
1 | Only return profiles with phone numbers |
Require Contact Info (require_phones_or_emails: true) |
1 | Only return profiles with phone OR email |
How Credits Are Calculated
Credits are consumed based on the actual features used in your search request. The system tracks the total credits consumed per API call.
Important: You must have a positive credit balance to make search requests. Your credit balance is checked before each search.
- Basic Fast Search:
type: "light"= 1 credit base - Pro Search with Emails:
type: "premium"+show_emails: true= 5 + 2 credits - Full Featured Search:
type: "premium"+insights: true+show_emails: true+show_phone_numbers: true= combined credits
POST /person/search
Search for professional contacts using natural language queries.
POST /person/search
Parameters
Natural language search query describing who you're looking for (max 1000 chars).
*Required unless
cursor or request_id is provided for pagination.Examples:
- "Software engineers at Microsoft in Seattle"
- "Marketing directors at Fortune 500 companies"
- "Startup founders who attended Stanford"
- "Sales managers in healthcare with 10+ years experience"
Maximum number of results to return per request (default: 10, max: 100)
Example: 25
Starting position in the result set, 0-indexed (default: 0, max: 999)
Use with
limit for pagination. Combined offset + limit cannot exceed 1000.Example: 50
Opaque pagination token from a previous response's
next_cursor field. Recommended for pagination.The cursor includes position and page size. When provided,
query and limit are optional (you can override limit if needed).Example: "eyJvIjo1MCwiciI6ImFiYzEyM180NTY3ODlfMTIzNCJ9"
Request ID from a previous response to continue fetching results from the same search.
When provided,
query is optional. If both are provided, query must match the original.Example: "abc12345_1737123456_1234"
Force a fresh search even if cached results exist for the same query (default: false)
Example: true
Search quality tier. Trade-off between speed and result quality. (default: premium)
light- Fastest, basic search. Note:insightsandhigh_freshnessparameters are not available for light type and will be ignored.medium- Balanced speed and quality.premium- Best quality, most comprehensive results.
Include email addresses in results (default: false)
Example: true
Include phone numbers in results (default: false)
Example: true
Only return profiles that have email addresses available (default: false)
Example: true
Only return profiles that have phone numbers available (default: false)
Example: true
Only return profiles that have either phone numbers OR email addresses (default: false)
Example: true
Include AI-generated insights about each result's relevance to your query (default: false). Note: Not available for
light type searches - will be ignored.Example: true
Prioritize recently updated profiles in results (default: false). Note: Not available for
light type searches - will be ignored.Example: true
Include AI-powered relevance scoring for each result (default: false). When enabled, each result includes a
score field indicating how well the profile matches your query.Example: true
URL to receive results asynchronously via webhook
Example: https://yourapp.com/webhook/search
Structured filters for precise search targeting. See Custom Filters section below for all available fields.
Request Example (Premium)
Request Example (Light - Fastest)
Light type searches are faster but don't support insights or high_freshness parameters:
Request Example with Custom Filters
Response Codes
200 Search completed successfully
400 Invalid request parameters or missing query
401 Invalid API credentials
429 Rate limit exceeded
Response Example
Pagination
To fetch more results, use the next_cursor from the response:
GET /person/search
Check the status of a search request.
GET /person/search?request_id=
Parameters
The request ID returned from the search call
Example: 12345
Request Example
Response Codes
200 Status retrieved successfully
400 Invalid request parameters
401 Invalid API credentials
404 Request ID not found
Response Example
Pagination
The API supports simple, efficient pagination. Results are cached automatically, so paginating through your results is free after the initial fetch.
Recommended: Cursor-Based Pagination
The simplest and most reliable way to paginate is using the next_cursor from the response:
- Make your initial search request with
queryandlimit - Use the
next_cursorfrom the response for subsequent requests - Continue until
has_moreisfalseornext_cursoris absent
Why cursor is preferred: The cursor automatically encodes your position and search context. You don't need to track offsets or remember the request_id.
Pagination Methods
1. Cursor-Based (Recommended)
Use next_cursor from the response. The cursor encodes both position and page size automatically.
The cursor remembers your page size (limit). You can override it by providing a different limit in your request.
2. Request ID + Offset (Alternative)
Use the request_id from your first response with offset to access specific positions within your results.
offset: 100, you'll be charged for results 26-125. For cost efficiency, paginate sequentially using cursor.
3. Repeat Query with Offset (Not Recommended)
You can repeat the same query with a different offset. The system will automatically find your cached results.
cursor or request_id avoids this issue.
Example: Pagination Sequence
| Request | Parameters | Results Returned |
|---|---|---|
| 1st request | query, limit: 25 |
Results 0-24 (25 results) |
| 2nd request | cursor: "..." (from response) |
Results 25-49 (next 25 results) |
| 3rd request | cursor: "..." (from response) |
Results 50-74 (next 25 results) |
Note: Each request returns only the requested slice - no deduplication needed!
Using Cursor for Pagination
Initial Request
Initial Response
Pagination Request (using cursor)
Or: Pagination Request (using request_id + offset)
- Using
cursororrequest_idis free for cached results - Maximum reachable position is 1000 (
offset + limit <= 1000) - Results are cached for 30 days - after that, use
force_new: truefor fresh data has_moreindicates if more results are availablefrom_cache: truemeans no credits were charged for this request
Cost Efficiency
Credits are only charged for new results:
- Initial request: Fetches and caches results, credits charged
- Subsequent pagination: Serves from cache, FREE
- Beyond cached range: Fetches additional results, credits charged for new results only
Example: Getting All Results
Here's how to paginate through all results efficiently:
import requests
import time
def get_all_search_results(api_key, api_secret, query, batch_size=25, max_results=1000):
"""
Fetch all search results using cursor-based pagination.
Only the first batch incurs credits; subsequent pages are cached (free).
"""
all_results = []
next_cursor = None
total_fetched = 0
while total_fetched < max_results:
# Prepare request data
if next_cursor:
# Use cursor for subsequent requests (no query needed)
data = {
'cursor': next_cursor,
'limit': batch_size
}
else:
# Initial request with query
data = {
'query': query,
'limit': batch_size
}
# Make request
response = requests.post(
'https://api.nyne.ai/person/search',
headers={
'X-API-Key': api_key,
'X-API-Secret': api_secret,
'Content-Type': 'application/json'
},
json=data
)
result = response.json()
if result['data']['status'] == 'completed':
results = result['data']['results']
all_results.extend(results)
total_fetched += len(results)
# Check if there are more results
if not result['data'].get('has_more'):
break
# Get cursor for next page
next_cursor = result['data'].get('next_cursor')
if not next_cursor:
break
elif result['data']['status'] == 'processing':
# Wait for processing to complete, then retry
time.sleep(2)
else:
# Error - break
print(f"Error: {result}")
break
return all_results
# Usage
query = "Software engineers at Fortune 500 companies in San Francisco"
results = get_all_search_results(api_key, api_secret, query, batch_size=25)
print(f"Found {len(results)} total results")
Custom Filters
Custom filters allow you to apply structured, precise filtering criteria to your search results. While the natural language query parameter handles semantic search, custom filters provide exact matching on specific fields.
Array Filters
These filters accept arrays of strings. Results will match if they contain any of the specified values.
| Field | Type | Description |
|---|---|---|
locations | array | Geographic locations (cities, regions, countries) |
languages | array | Languages spoken by the person |
titles | array | Job titles to match |
industries | array | Industry sectors |
companies | array | Company names (current or past) |
universities | array | Universities attended |
keywords | array | Keywords to match in profile |
degrees | array | Education degrees (e.g., "bachelor", "master", "phd") |
specialization_categories | array | Academic specialization categories (e.g., "Computer Science & IT") |
Numeric Range Filters
These filters accept integer values for filtering by ranges.
| Field | Type | Description |
|---|---|---|
min_linkedin_followers | integer | Minimum LinkedIn follower count |
max_linkedin_followers | integer | Maximum LinkedIn follower count |
min_total_experience_years | integer | Minimum total years of work experience |
max_total_experience_years | integer | Maximum total years of work experience |
min_current_experience_years | integer | Minimum years at current position |
max_current_experience_years | integer | Maximum years at current position |
min_estimated_age | integer | Minimum estimated age |
max_estimated_age | integer | Maximum estimated age |
Boolean Filters
These filters accept true/false values.
| Field | Type | Description |
|---|---|---|
studied_at_top_universities | boolean | Filter for graduates of top-ranked universities |
has_startup_experience | boolean | Has worked at a startup |
has_saas_experience | boolean | Has worked at a SaaS company |
has_b2b_experience | boolean | Has B2B experience |
has_b2c_experience | boolean | Has B2C experience |
Exact Match Filters
These filters accept single string values for exact matching.
| Field | Type | Description |
|---|---|---|
first_name | string | Filter by first name |
middle_name | string | Filter by middle name |
last_name | string | Filter by last name |
gender | string | Filter by gender ("male" or "female") |
Example: Comprehensive Filter Usage
Validation Rules
- Array filters: Must be arrays of non-empty strings. Single string values are automatically converted to arrays. Empty arrays are ignored.
- Numeric range filters: Must be non-negative integers. If both min and max are provided, min must be less than or equal to max.
- Boolean filters: Accept
true,false,1, or0. Invalid values are silently ignored. - Gender filter: Must be exactly
"male"or"female"(case-insensitive). Other values return an error. - Name filters: Accept any non-empty string. Values are sanitized to prevent injection.
Usage Statistics
Usage statistics are now available through the unified usage API at /usage. This endpoint provides comprehensive usage information including credits used, monthly allocation, and breakdown by API type.
Unified Usage API
For detailed usage statistics, please use:
This endpoint shows all your API usage in one place, including enrichment and search requests with proper credit counting.
Response Format
All API responses follow a consistent JSON format:
Success Response
Error Response
Error Codes
| HTTP Code | Error Code | Description |
|---|---|---|
| 400 | missing_parameters | Required parameters are missing |
| 400 | invalid_parameters | Invalid parameter values |
| 400 | invalid_custom_filters | Invalid custom_filters value. Possible causes: custom_filters is not an object, numeric range filters contain non-integer values, min value exceeds max value, or gender is not 'male' or 'female' |
| 401 | invalid_credentials | API key or secret is incorrect |
| 404 | request_not_found | Request ID not found (for status checks) |
| 429 | rate_limit_exceeded | Rate limit exceeded |
| 429 | insufficient_credits | Insufficient credit balance to complete the request |
| 500 | internal_error | Internal server error |
Callback System
When you provide a callback_url, the API will send the search results to your endpoint via HTTP POST.
Callback Request Format
Callback Retry Policy
- Maximum 5 retry attempts
- Exponential backoff: 1s, 5s, 15s, 1m, 5m
- 30-second timeout per request
- Your endpoint should return HTTP 2xx for success
Try EZ Tool for a no-code interface | Open Playground