curl --request GET \
--url https://api.goextrovert.com/client/v2/lead-finder/search-schema \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.goextrovert.com/client/v2/lead-finder/search-schema"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.goextrovert.com/client/v2/lead-finder/search-schema', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.goextrovert.com/client/v2/lead-finder/search-schema",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.goextrovert.com/client/v2/lead-finder/search-schema"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.goextrovert.com/client/v2/lead-finder/search-schema")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.goextrovert.com/client/v2/lead-finder/search-schema")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"version": "<string>",
"fields": [
{
"field": "contact.seniority",
"control": "<string>",
"valuePolicy": "<string>",
"matchModes": [
"<string>"
],
"values": [
"<string>"
],
"sources": [
"<string>"
],
"timeFrames": [
"<string>"
],
"ops": [
"any.include",
"any.exclude"
],
"valueSyntax": "<string>",
"numericDomain": "<string>",
"scope": "<string>",
"maxSources": 123
}
],
"limits": {
"maxValuesPerArray": 123,
"maxQueryBytes": 123,
"maxQueryDepth": 123,
"maxPageSize": 123,
"resultCeiling": 123
},
"rules": {
"excludeOnlyQueryRejected": true,
"emptyQueryRejected": true
}
},
"message": "Operation completed successfully"
}{
"status": "error",
"data": null,
"message": "An error occurred while processing the request"
}Get Search Schema
Returns the people-search filter grammar: every field a query may filter on (fields), what each accepts, the bounds a whole query is held to (limits) and the whole-query refusals (rules). A field with valuePolicy closed carries its whole vocabulary in values; a custom field takes free values. Free: consumes no credits.
A query is a flat list of conditions, all of which must hold: {"filters":[{"field":"contact.titleLatest","op":"any.include","mode":"WORD","values":["sales director"]},{"field":"contact.titleLatest","op":"any.exclude","mode":"STRICT","values":["intern"]},{"field":"account.employeeSize","op":"range","ranges":[{"start":51,"end":200}]}]}. Each condition names one field, one of that field’s ops as op, and the payload keys of the field’s control:
control | op | Payload keys |
|---|---|---|
text_match | any.include, any.exclude, all.include | mode (one of matchModes), values |
value_list | any.include, any.exclude | values |
keyword_sources | any.include, any.exclude | sources: [{"source":"HEADLINE","mode":"WORD"}], values |
enum_list | in | values |
numeric_range_list | range | ranges: [{"start":51,"end":200},{"start":1001}] |
numeric_range | range | start, end |
duration_range | range | min, max: {"year":1,"month":6} |
date_range | range | start, end |
metric_employee_rows | rows | rows: [{"departments":["sales"],"start":10,"end":50}] |
metric_growth_rows | rows | rows: [{"departments":["sales"],"start":10,"end":50,"timeFrame":"TWELVE"}] |
A field takes only the op values its ops lists. any.include matches any of the values, any.exclude drops matches of any of them, all.include requires every value. mode, values, sources, ranges and rows are required where the control takes them, and every array is non-empty. A keyword condition has no mode of its own: each source carries one, each source from sources at most once, at most maxSources per condition. A band takes start, end or both, inclusive, and the bands of ranges combine with OR; a duration takes min, max or both, each {"year":…,"month":…} with both keys required (month 0 to 11 on top of whole years, e.g. {"year":5,"month":0} for five years); a date is epoch milliseconds or an ISO date such as "2024-01-01"; metric_growth_rows counts percent over a timeFrame from timeFrames. A key the control does not take, an op the field does not list, or a second condition with the same field and op is refused: put all the values of one field and op pair into one condition. A query needs at least one condition that is not any.exclude. The whole query, serialized as compact JSON, takes at most 149504 bytes. A refusal names the condition by its place in the list and, where known, its field and op, e.g. query.filters[0].ranges[1]: starts above its end (account.employeeSize range). limits.maxQueryBytes and limits.maxQueryDepth count the query after the backend normalizes it, not the request as sent.
Person fields: contact.titleLatest job title of the primary active role, contact.titleCurrent any active role, contact.titlePrevious past roles; contact.seniority level; contact.departmentAndFunction the person’s function; contact.location where the person is; contact.durationCurrentJob time in the current role, contact.durationCurrentCompany time at the current company, contact.durationTotal total experience; contact.skill; contact.certification; contact.educationDegree, contact.educationFieldOfStudy; contact.language languages spoken (closed values, but a text_match control, so a condition still needs mode); contact.keyword terms searched in chosen sections of the profile; contact.profileBadge LinkedIn profile badges; contact.linkedInFollowers.
Company fields (the employer): account.name, account.domain and account.linkedin (company LinkedIn URL) each name the employer, and an any.exclude condition on any of them may list several employers to leave out; account.industries; account.productAndServices; account.technologies; account.employeeSize headcount; account.retailSize number of offices; account.revenue annual revenue in USD; account.foundedYear; account.type company type such as PUBLIC_COMPANY or NON_PROFIT; account.socialMedia has a profile on a network; account.language operating language; account.keyword terms searched in chosen parts of the company record; account.fundingType round types, account.fundingTotalAmount and account.fundingLastAmount in USD, account.fundingDate last round date; account.metricEmployee headcount per department, account.metricGrowth headcount growth per department in percent over a window; account.naics 6-digit NAICS codes; account.location where the company has an office.
curl --request GET \
--url https://api.goextrovert.com/client/v2/lead-finder/search-schema \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.goextrovert.com/client/v2/lead-finder/search-schema"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.goextrovert.com/client/v2/lead-finder/search-schema', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.goextrovert.com/client/v2/lead-finder/search-schema",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.goextrovert.com/client/v2/lead-finder/search-schema"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.goextrovert.com/client/v2/lead-finder/search-schema")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.goextrovert.com/client/v2/lead-finder/search-schema")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"version": "<string>",
"fields": [
{
"field": "contact.seniority",
"control": "<string>",
"valuePolicy": "<string>",
"matchModes": [
"<string>"
],
"values": [
"<string>"
],
"sources": [
"<string>"
],
"timeFrames": [
"<string>"
],
"ops": [
"any.include",
"any.exclude"
],
"valueSyntax": "<string>",
"numericDomain": "<string>",
"scope": "<string>",
"maxSources": 123
}
],
"limits": {
"maxValuesPerArray": 123,
"maxQueryBytes": 123,
"maxQueryDepth": 123,
"maxPageSize": 123,
"resultCeiling": 123
},
"rules": {
"excludeOnlyQueryRejected": true,
"emptyQueryRejected": true
}
},
"message": "Operation completed successfully"
}{
"status": "error",
"data": null,
"message": "An error occurred while processing the request"
}Authorizations
API Key for authentication