Discovery API
Discover people from the open web using natural language queries. Describe who you're looking for, define match conditions, and let the API search, evaluate, and enrich candidates automatically.
API Endpoint
https://api.nyne.ai/person/discovery
What's Included
- Natural Language Search: Describe the people you want to find in plain English
- Match Evaluation: Define requirements and get per-candidate match status with evidence
- Custom Extractions: Specify enrichment fields to extract for each discovered person
- Source Citations: Every evaluation backed by reasoning, confidence scores, and source citations
How It Works
Input: Provide a natural language query describing the people you want to find, along with optional match requirements, extraction fields, quality tier, and exclusion lists.
Processing Pipeline:
- Search: The query is used to search the open web for matching candidates
- Evaluation: Each candidate is evaluated against your requirements with evidence-based matching
- Extraction: Requested enrichment fields are extracted for each matched candidate
- Ranking: Results are ranked by match quality and returned with full citations
Output: A list of discovered people with match status, evaluations, extractions, and source citations.
Try the API Playground
Test the API with our interactive playground to make real requests and see live responses.
Launch Discovery PlaygroundAuthentication
All API requests require authentication using your API key and secret in the request headers:
X-API-Key: your_api_key
X-API-Secret: your_api_secret
Rate Limits
| Limit Type | Default Limit | Description |
|---|---|---|
| Per Minute | 10 requests | Maximum requests per minute |
| Per Hour | 100 requests | Maximum requests per hour |
Credit Cost: 10 credits per request
Submit Discovery Request
Submit a request to discover people from the open web matching your criteria.
Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
query |
string | Yes | Natural language query describing the people to find (max 2000 characters) |
requirements |
array | No | Array of match conditions, each with name and description (max 20 items) |
extract |
array | No | Array of enrichment fields to extract, each with name and description (max 10 items) |
limit |
integer | No | Maximum number of results to return. Range: 5-100. Default: 10 |
quality |
string | No | Quality tier for discovery. One of: basic, standard, premium. Default: standard |
exclude |
array | No | Array of entities to exclude from results, each with name and url (max 100 items) |
metadata |
object | No | Pass-through metadata returned with results. Values must be string, number, or boolean. |
callback_url |
string | No | HTTPS URL to receive webhook notification when processing completes |
Requirements Object
| Field | Type | Description |
|---|---|---|
name |
string | Short identifier for the requirement (e.g., "published_papers") |
description |
string | Description of the match condition (e.g., "Has published research papers in NLP") |
Extract Object
| Field | Type | Description |
|---|---|---|
name |
string | Short identifier for the field (e.g., "email") |
description |
string | Description of what to extract (e.g., "Professional email address") |
Exclude Object
| Field | Type | Description |
|---|---|---|
name |
string | Name of the person or entity to exclude |
url |
string | URL associated with the entity to exclude |
Example Request
curl -X POST "https://api.nyne.ai/person/discovery" \
-H "X-API-Key: your_api_key" \
-H "X-API-Secret: your_api_secret" \
-H "Content-Type: application/json" \
-d '{
"query": "AI researchers specializing in NLP at top US universities",
"requirements": [
{
"name": "published_papers",
"description": "Has published research papers in NLP or computational linguistics"
},
{
"name": "university_affiliation",
"description": "Currently affiliated with a top-50 US university"
}
],
"extract": [
{
"name": "email",
"description": "Professional or academic email address"
},
{
"name": "recent_publication",
"description": "Title of their most recent published paper"
}
],
"limit": 10,
"quality": "standard",
"callback_url": "https://yourapp.com/webhook/discovery"
}'
Response (202 Accepted)
{
"success": true,
"data": {
"request_id": "a1b2c3d4e5f6...",
"status": "pending",
"message": "Discovery request queued for processing. Use GET with request_id to check status.",
"created_on": "2026-02-19T10:30:00"
},
"timestamp": "2026-02-19T10:30:00Z"
}
Check Request Status
Check the status of a pending discovery request and retrieve results when complete.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
request_id |
string | Yes | The request ID returned from the POST request |
Processing Stages
| Status | Description |
|---|---|
pending |
Request queued for processing |
searching |
Searching the web, evaluating candidates, and extracting data |
completed |
Discovery complete, results available |
failed |
Processing failed |
- Recommended poll interval: 5 seconds
- Typical processing time: 1-3 minutes
- Maximum wait time: 10 minutes before considering timeout
Example Request
curl -X GET "https://api.nyne.ai/person/discovery?request_id=a1b2c3d4e5f6..." \
-H "X-API-Key: your_api_key" \
-H "X-API-Secret: your_api_secret"
Response Format
When the request is completed, the response includes all discovered people with match evaluations, extractions, and source citations.
Completed Response
{
"success": true,
"data": {
"request_id": "a1b2c3d4e5f6...",
"status": "completed",
"completed": true,
"completed_on": "2026-02-19T10:33:00",
"created_on": "2026-02-19T10:30:00",
"result": {
"entity_type": "people",
"query": "AI researchers specializing in NLP at top US universities",
"results_count": 10,
"results": [
{
"name": "Dr. Jane Smith",
"url": "janesmith.ai",
"description": "NLP researcher at Stanford University specializing in large language models and computational semantics",
"match_status": "matched",
"evaluations": {
"published_papers": {
"value": "yes",
"matched": true
},
"university_affiliation": {
"value": "yes",
"matched": true
}
},
"extractions": {
"email": "jane@stanford.edu",
"recent_publication": "Efficient Fine-Tuning Methods for Multilingual NLP Models"
},
"sources": [
{
"field": "published_papers",
"reasoning": "Found multiple publications in top NLP venues including ACL and EMNLP",
"confidence": "high",
"citations": [
{
"title": "Stanford NLP Lab - Publications",
"url": "https://nlp.stanford.edu/pubs",
"excerpts": ["Dr. Smith has published over 30 papers in computational linguistics..."]
}
]
},
{
"field": "university_affiliation",
"reasoning": "Currently listed as Associate Professor at Stanford University",
"confidence": "high",
"citations": [
{
"title": "Stanford NLP Lab - People",
"url": "https://nlp.stanford.edu/people",
"excerpts": ["Jane Smith, Associate Professor of Computer Science"]
}
]
}
]
}
],
"metrics": {
"candidates_evaluated": 50,
"candidates_matched": 10
}
}
},
"timestamp": "2026-02-19T10:33:00Z"
}
Result Fields
| Field | Type | Description |
|---|---|---|
entity_type |
string | Always "people" for person discovery |
query |
string | The original query submitted |
results_count |
integer | Number of matched results returned |
results |
array | Array of discovered person objects |
metrics |
object | Processing metrics including candidates evaluated and matched |
Person Result Fields
| Field | Type | Description |
|---|---|---|
name |
string | Full name of the discovered person |
url |
string | Primary URL associated with the person |
description |
string | Brief description of the person and their relevance |
match_status |
string | Overall match status (e.g., "matched") |
evaluations |
object | Per-requirement evaluation results with value and matched boolean |
extractions |
object | Extracted field values as specified in the extract parameter |
sources |
array | Source citations with field, reasoning, confidence, and citation details |
Code Examples
cURL
# Submit a discovery request
curl -X POST "https://api.nyne.ai/person/discovery" \
-H "X-API-Key: your_api_key" \
-H "X-API-Secret: your_api_secret" \
-H "Content-Type: application/json" \
-d '{
"query": "AI researchers specializing in NLP at top US universities",
"requirements": [
{"name": "published_papers", "description": "Has published research papers in NLP"},
{"name": "university_affiliation", "description": "Currently at a top-50 US university"}
],
"extract": [
{"name": "email", "description": "Professional email address"}
],
"limit": 10,
"quality": "standard"
}'
# Check status (replace REQUEST_ID with the returned request_id)
curl -X GET "https://api.nyne.ai/person/discovery?request_id=REQUEST_ID" \
-H "X-API-Key: your_api_key" \
-H "X-API-Secret: your_api_secret"
Python
import requests
import time
API_KEY = "your_api_key"
API_SECRET = "your_api_secret"
BASE_URL = "https://api.nyne.ai"
headers = {
"X-API-Key": API_KEY,
"X-API-Secret": API_SECRET,
"Content-Type": "application/json"
}
# Step 1: Submit discovery request
payload = {
"query": "AI researchers specializing in NLP at top US universities",
"requirements": [
{"name": "published_papers", "description": "Has published research papers in NLP"},
{"name": "university_affiliation", "description": "Currently at a top-50 US university"}
],
"extract": [
{"name": "email", "description": "Professional email address"},
{"name": "recent_publication", "description": "Title of most recent paper"}
],
"limit": 10,
"quality": "standard"
}
response = requests.post(f"{BASE_URL}/person/discovery", json=payload, headers=headers)
data = response.json()
if not data.get("success"):
print(f"Error: {data}")
exit(1)
request_id = data["data"]["request_id"]
print(f"Request submitted: {request_id}")
# Step 2: Poll for results
while True:
time.sleep(5)
response = requests.get(
f"{BASE_URL}/person/discovery",
params={"request_id": request_id},
headers=headers
)
result = response.json()
status = result["data"]["status"]
print(f"Status: {status}")
if status == "completed":
discovery = result["data"]["result"]
print(f"Found {discovery['results_count']} people")
for person in discovery["results"]:
print(f" - {person['name']}: {person['description']}")
if person.get("extractions"):
for key, value in person["extractions"].items():
print(f" {key}: {value}")
break
elif status == "failed":
print(f"Discovery failed: {result['data'].get('error', 'Unknown error')}")
break
JavaScript (Node.js)
const API_KEY = "your_api_key";
const API_SECRET = "your_api_secret";
const BASE_URL = "https://api.nyne.ai";
const headers = {
"X-API-Key": API_KEY,
"X-API-Secret": API_SECRET,
"Content-Type": "application/json"
};
async function discoverPeople() {
// Step 1: Submit discovery request
const payload = {
query: "AI researchers specializing in NLP at top US universities",
requirements: [
{ name: "published_papers", description: "Has published research papers in NLP" },
{ name: "university_affiliation", description: "Currently at a top-50 US university" }
],
extract: [
{ name: "email", description: "Professional email address" },
{ name: "recent_publication", description: "Title of most recent paper" }
],
limit: 10,
quality: "standard"
};
const submitResponse = await fetch(`${BASE_URL}/person/discovery`, {
method: "POST",
headers,
body: JSON.stringify(payload)
});
const submitData = await submitResponse.json();
if (!submitData.success) {
console.error("Error:", submitData);
return;
}
const requestId = submitData.data.request_id;
console.log(`Request submitted: ${requestId}`);
// Step 2: Poll for results
while (true) {
await new Promise(resolve => setTimeout(resolve, 5000));
const statusResponse = await fetch(
`${BASE_URL}/person/discovery?request_id=${requestId}`,
{ headers }
);
const statusData = await statusResponse.json();
const status = statusData.data.status;
console.log(`Status: ${status}`);
if (status === "completed") {
const discovery = statusData.data.result;
console.log(`Found ${discovery.results_count} people`);
discovery.results.forEach(person => {
console.log(` - ${person.name}: ${person.description}`);
if (person.extractions) {
Object.entries(person.extractions).forEach(([key, value]) => {
console.log(` ${key}: ${value}`);
});
}
});
return statusData;
} else if (status === "failed") {
console.error("Discovery failed:", statusData.data.error || "Unknown error");
return statusData;
}
}
}
discoverPeople();
PHP
<?php
$apiKey = "your_api_key";
$apiSecret = "your_api_secret";
$baseUrl = "https://api.nyne.ai";
// Step 1: Submit discovery request
$payload = [
"query" => "AI researchers specializing in NLP at top US universities",
"requirements" => [
["name" => "published_papers", "description" => "Has published research papers in NLP"],
["name" => "university_affiliation", "description" => "Currently at a top-50 US university"]
],
"extract" => [
["name" => "email", "description" => "Professional email address"],
["name" => "recent_publication", "description" => "Title of most recent paper"]
],
"limit" => 10,
"quality" => "standard"
];
$ch = curl_init("$baseUrl/person/discovery");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-API-Key: $apiKey",
"X-API-Secret: $apiSecret",
"Content-Type: application/json"
]
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
if (!$data["success"]) {
echo "Error: " . print_r($data, true);
exit(1);
}
$requestId = $data["data"]["request_id"];
echo "Request submitted: $requestId\n";
// Step 2: Poll for results
while (true) {
sleep(5);
$ch = curl_init("$baseUrl/person/discovery?request_id=$requestId");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-API-Key: $apiKey",
"X-API-Secret: $apiSecret"
]
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
$status = $result["data"]["status"];
echo "Status: $status\n";
if ($status === "completed") {
$discovery = $result["data"]["result"];
echo "Found " . $discovery["results_count"] . " people\n";
foreach ($discovery["results"] as $person) {
echo " - " . $person["name"] . ": " . $person["description"] . "\n";
if (isset($person["extractions"])) {
foreach ($person["extractions"] as $key => $value) {
echo " $key: $value\n";
}
}
}
break;
} elseif ($status === "failed") {
echo "Discovery failed: " . ($result["data"]["error"] ?? "Unknown error") . "\n";
break;
}
}
?>
Error Codes
| HTTP Status | Error Code | Description |
|---|---|---|
| 400 | INVALID_PARAMETERS | Missing or invalid request parameters |
| 400 | MISSING_PARAMETER | Required parameter not provided |
| 401 | AUTHENTICATION_FAILED | Invalid or missing API credentials |
| 402 | INSUFFICIENT_CREDITS | Not enough credits (requires 10 credits) |
| 403 | NO_ACTIVE_SUBSCRIPTION | No active subscription found |
| 403 | PRODUCT_NOT_AVAILABLE | Discovery not available on your plan |
| 403 | ACCESS_DENIED | Not authorized to access this resource |
| 404 | NOT_FOUND | Request not found |
| 429 | RATE_LIMIT_EXCEEDED | Too many requests, please slow down |
| 500 | QUEUE_ERROR | Failed to queue request for processing |
Callback Notifications
When you provide a callback_url, we'll send a POST request to that URL when processing completes:
POST your_callback_url
Content-Type: application/json
{
"request_id": "a1b2c3d4e5f6...",
"status": "completed",
"completed": true,
"result": {
"entity_type": "people",
"query": "AI researchers specializing in NLP at top US universities",
"results_count": 10,
"results": [...],
"metrics": {
"candidates_evaluated": 50,
"candidates_matched": 10
}
}
}
Ready to Get Started?
Try the API in our interactive playground or contact us for support.
Email: support@nyne.ai