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:

  1. Search: The query is used to search the open web for matching candidates
  2. Evaluation: Each candidate is evaluated against your requirements with evidence-based matching
  3. Extraction: Requested enrichment fields are extracted for each matched candidate
  4. 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 Playground

Authentication

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
API Key Required

You need to log in to access your API credentials.

Log In & Get API Keys

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.

POST /person/discovery

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.

GET /person/discovery?request_id={request_id}

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
Polling Recommendations:
  • 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.

Open API Playground

Email: support@nyne.ai

Open Playground