Please Log In

You need to log in to access your API credentials and start using our APIs. Start with our free trial!

Log In & Start Free Trial

Person 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 Playground

Overview

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.

Header Authentication (Recommended)
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.

Example Configurations:
  • 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

query (string, required*)
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"
limit (integer, optional)
Maximum number of results to return per request (default: 10, max: 100)
Example: 25
offset (integer, optional)
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
cursor (string, optional)
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 (string, optional)
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_new (boolean, optional)
Force a fresh search even if cached results exist for the same query (default: false)
Example: true
type (string, optional)
Search quality tier. Trade-off between speed and result quality. (default: premium)
  • light - Fastest, basic search. Note: insights and high_freshness parameters are not available for light type and will be ignored.
  • medium - Balanced speed and quality.
  • premium - Best quality, most comprehensive results.
Example: "premium"
show_emails (boolean, optional)
Include email addresses in results (default: false)
Example: true
show_phone_numbers (boolean, optional)
Include phone numbers in results (default: false)
Example: true
require_emails (boolean, optional)
Only return profiles that have email addresses available (default: false)
Example: true
require_phone_numbers (boolean, optional)
Only return profiles that have phone numbers available (default: false)
Example: true
require_phones_or_emails (boolean, optional)
Only return profiles that have either phone numbers OR email addresses (default: false)
Example: true
insights (boolean, optional)
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
high_freshness (boolean, optional)
Prioritize recently updated profiles in results (default: false). Note: Not available for light type searches - will be ignored.
Example: true
profile_scoring (boolean, optional)
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
callback_url (string, optional)
URL to receive results asynchronously via webhook
Example: https://yourapp.com/webhook/search
custom_filters (object, optional)
Structured filters for precise search targeting. See Custom Filters section below for all available fields.

Request Example (Premium)

{ "query": "Software engineers at Fortune 500 companies in San Francisco with machine learning experience", "type": "premium", "limit": 25, "show_emails": true, "show_phone_numbers": true, "insights": true, "high_freshness": false, "profile_scoring": true }

Request Example (Light - Fastest)

Light type searches are faster but don't support insights or high_freshness parameters:

{ "query": "Software engineers at Fortune 500 companies in San Francisco", "type": "light", "limit": 25, "show_emails": true, "show_phone_numbers": true }

Request Example with Custom Filters

{ "query": "Software engineers", "limit": 25, "custom_filters": { "locations": ["San Francisco", "New York"], "industries": ["Software", "Technology"], "titles": ["Software Engineer", "Senior Engineer"], "min_total_experience_years": 5, "max_total_experience_years": 15, "has_startup_experience": true, "degrees": ["bachelor", "master"], "languages": ["English", "Spanish"] } }

Response Codes

200 Search completed successfully

400 Invalid request parameters or missing query

401 Invalid API credentials

429 Rate limit exceeded

Response Example

{ "success": true, "data": { "request_id": "abc12345_1737123456_1234", "status": "completed", "results": [ { "displayname": "John Smith", "headline": "Senior Sales Manager", "bio": "Experienced sales leader with 15+ years in enterprise software sales.", "location": "San Francisco, CA", "gender": "male", "best_business_email": "john.smith@techcorp.com", "best_personal_email": "johnsmith@gmail.com", "altemails": [ "john.smith@techcorp.com", "j.smith@example.com" ], "fullphone": [ { "fullphone": "+1-555-123-4567", "phone_type": "mobile" } ], "social_profiles": { "linkedin": { "url": "https://www.linkedin.com/in/johnsmith", "username": "johnsmith", "connections": 500, "followers": 1200, "photo_url": "https://media.licdn.com/..." } }, "organizations": [ { "name": "Tech Corp", "title": "Senior Sales Manager", "startDate": "2020-01", "location": "San Francisco, CA", "company_website": "https://techcorp.com", "industries": ["Software", "Technology"], "num_employees": 5000 } ], "schools_attended": ["Stanford University", "UC Berkeley"], "schools_info": [ { "name": "Stanford University", "degree": "MBA", "major": "Business Administration", "endDate": "2010" } ], "total_experience_years": 15, "is_decision_maker": true, "score": 0.95, "insights": { "overall_summary": "Highly relevant match - experienced sales leader at Fortune 500 company in target location", "query_insights": "Strong match for sales manager role with extensive enterprise experience" } } ], "offset": 0, "limit": 25, "total_stored": 25, "total_estimate": 500, "has_more": true, "next_cursor": "eyJvIjoyNSwiciI6ImFiYzEyMzQ1XzE3MzcxMjM0NTZfMTIzNCJ9", "from_cache": false, "credits_charged": 125 }, "timestamp": "2024-01-15T10:30:00Z" }

Pagination

To fetch more results, use the next_cursor from the response:

{ "cursor": "eyJvIjoyNSwiciI6ImFiYzEyMzQ1XzE3MzcxMjM0NTZfMTIzNCJ9", "limit": 25 }

GET /person/search

Check the status of a search request.

GET /person/search?request_id=

Parameters

request_id (string, required)
The request ID returned from the search call
Example: 12345

Request Example

GET /person/search?request_id=12345

Response Codes

200 Status retrieved successfully

400 Invalid request parameters

401 Invalid API credentials

404 Request ID not found

Response Example

{ "success": true, "data": { "request_id": "abc12345_1737123456_1234", "status": "completed", "results": [ { "displayname": "John Smith", "headline": "Software Engineer at Tech Corp", "bio": "Software Engineer with expertise in web development and cloud technologies.", "location": "San Francisco, CA", "best_business_email": "john.smith@techcorp.com", "altemails": ["john.smith@techcorp.com", "j.smith@example.com"], "fullphone": [{"fullphone": "(555) 123-4567", "phone_type": "mobile"}], "social_profiles": { "linkedin": {"url": "https://linkedin.com/in/johnsmith", "username": "johnsmith"} }, "organizations": [{"name": "Tech Corp", "title": "Software Engineer", "startDate": "2020-01"}] } ], "offset": 0, "limit": 10, "total_stored": 1, "total_estimate": 1, "has_more": false, "from_cache": true, "credits_charged": 0 }, "timestamp": "2024-01-15T10:30:00Z" }

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:

  1. Make your initial search request with query and limit
  2. Use the next_cursor from the response for subsequent requests
  3. Continue until has_more is false or next_cursor is 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.

{ "cursor": "eyJvIjoyNSwiciI6ImFiYzEyMzQ1XzE3MzcxMjM0NTZfMTIzNCJ9" }

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.

{ "request_id": "abc12345_1737123456_1234", "offset": 50, "limit": 25 }
Note: If you request results beyond what's already been fetched, the system will fetch all results up to that point. For example, if you've fetched 25 results and request 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.

{ "query": "Software engineers at Fortune 500 companies", "offset": 25, "limit": 25 }
Caution: This method requires you to provide exactly the same query parameters (query, type, show_emails, etc.). If any parameter differs, a new search will be created and you'll be charged again. Using 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

{ "query": "Software engineers at Fortune 500 companies in San Francisco", "limit": 25 }

Initial Response

{ "request_id": "abc12345_1737123456_1234", "status": "completed", "results": [...], "offset": 0, "limit": 25, "total_stored": 25, "total_estimate": 500, "has_more": true, "next_cursor": "eyJvIjoyNSwiciI6ImFiYzEyMzQ1XzE3MzcxMjM0NTZfMTIzNCJ9", "from_cache": false, "credits_charged": 125 }

Pagination Request (using cursor)

{ "cursor": "eyJvIjoyNSwiciI6ImFiYzEyMzQ1XzE3MzcxMjM0NTZfMTIzNCJ9", "limit": 25 }

Or: Pagination Request (using request_id + offset)

{ "request_id": "abc12345_1737123456_1234", "offset": 25, "limit": 25 }
Key Points:
  • Using cursor or request_id is free for cached results
  • Maximum reachable position is 1000 (offset + limit <= 1000)
  • Results are cached for 30 days - after that, use force_new: true for fresh data
  • has_more indicates if more results are available
  • from_cache: true means 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:

Python Example
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.

FieldTypeDescription
locationsarrayGeographic locations (cities, regions, countries)
languagesarrayLanguages spoken by the person
titlesarrayJob titles to match
industriesarrayIndustry sectors
companiesarrayCompany names (current or past)
universitiesarrayUniversities attended
keywordsarrayKeywords to match in profile
degreesarrayEducation degrees (e.g., "bachelor", "master", "phd")
specialization_categoriesarrayAcademic specialization categories (e.g., "Computer Science & IT")

Numeric Range Filters

These filters accept integer values for filtering by ranges.

FieldTypeDescription
min_linkedin_followersintegerMinimum LinkedIn follower count
max_linkedin_followersintegerMaximum LinkedIn follower count
min_total_experience_yearsintegerMinimum total years of work experience
max_total_experience_yearsintegerMaximum total years of work experience
min_current_experience_yearsintegerMinimum years at current position
max_current_experience_yearsintegerMaximum years at current position
min_estimated_ageintegerMinimum estimated age
max_estimated_ageintegerMaximum estimated age

Boolean Filters

These filters accept true/false values.

FieldTypeDescription
studied_at_top_universitiesbooleanFilter for graduates of top-ranked universities
has_startup_experiencebooleanHas worked at a startup
has_saas_experiencebooleanHas worked at a SaaS company
has_b2b_experiencebooleanHas B2B experience
has_b2c_experiencebooleanHas B2C experience

Exact Match Filters

These filters accept single string values for exact matching.

FieldTypeDescription
first_namestringFilter by first name
middle_namestringFilter by middle name
last_namestringFilter by last name
genderstringFilter by gender ("male" or "female")

Example: Comprehensive Filter Usage

{ "query": "Product managers", "limit": 25, "custom_filters": { "locations": ["San Francisco Bay Area", "New York City"], "industries": ["Technology", "Software"], "titles": ["Product Manager", "Senior Product Manager", "Director of Product"], "companies": ["Google", "Meta", "Amazon", "Microsoft"], "min_total_experience_years": 5, "max_total_experience_years": 15, "has_startup_experience": true, "studied_at_top_universities": true, "degrees": ["bachelor", "master", "mba"], "languages": ["English"] } }

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, or 0. 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:

GET /usage

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

{ "success": true, "data": { ... }, "timestamp": "2024-01-15T10:30:00Z" }

Error Response

{ "success": false, "error": { "code": "error_code", "message": "Error message" }, "timestamp": "2024-01-15T10:30:00Z" }

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

{ "request_id": "abc12345_1737123456_1234", "status": "completed", "success": true, "completed": true, "data": { "results": [...], "offset": 0, "limit": 25, "total_stored": 15, "total_estimate": 100, "has_more": true, "next_cursor": "eyJvIjoxNSwiciI6ImFiYzEyMzQ1XzE3MzcxMjM0NTZfMTIzNCJ9" }, "completed_on": "2024-01-15T10:30:00Z", "timestamp": "2024-01-15T10:30:00Z" }

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
Important: Your callback endpoint should respond with HTTP 200-299 to indicate successful receipt. Any other response code will trigger a retry.

Support

Need help? Contact our support team:

Email: support@nyne.com

Try EZ Tool for a no-code interface | Open Playground