curl --request POST \
--url https://api.parallellabs.app/api/v0/leads/import \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"companyId": "<string>",
"listId": "<string>",
"filters": {},
"segment": [
"<string>"
],
"audience": {},
"daysBack": 123,
"importAll": true,
"count": 123,
"audienceName": "<string>",
"saveAudience": true
}
'import requests
url = "https://api.parallellabs.app/api/v0/leads/import"
payload = {
"companyId": "<string>",
"listId": "<string>",
"filters": {},
"segment": ["<string>"],
"audience": {},
"daysBack": 123,
"importAll": True,
"count": 123,
"audienceName": "<string>",
"saveAudience": True
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
companyId: '<string>',
listId: '<string>',
filters: {},
segment: ['<string>'],
audience: {},
daysBack: 123,
importAll: true,
count: 123,
audienceName: '<string>',
saveAudience: true
})
};
fetch('https://api.parallellabs.app/api/v0/leads/import', 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.parallellabs.app/api/v0/leads/import",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'companyId' => '<string>',
'listId' => '<string>',
'filters' => [
],
'segment' => [
'<string>'
],
'audience' => [
],
'daysBack' => 123,
'importAll' => true,
'count' => 123,
'audienceName' => '<string>',
'saveAudience' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.parallellabs.app/api/v0/leads/import"
payload := strings.NewReader("{\n \"companyId\": \"<string>\",\n \"listId\": \"<string>\",\n \"filters\": {},\n \"segment\": [\n \"<string>\"\n ],\n \"audience\": {},\n \"daysBack\": 123,\n \"importAll\": true,\n \"count\": 123,\n \"audienceName\": \"<string>\",\n \"saveAudience\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.parallellabs.app/api/v0/leads/import")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"companyId\": \"<string>\",\n \"listId\": \"<string>\",\n \"filters\": {},\n \"segment\": [\n \"<string>\"\n ],\n \"audience\": {},\n \"daysBack\": 123,\n \"importAll\": true,\n \"count\": 123,\n \"audienceName\": \"<string>\",\n \"saveAudience\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parallellabs.app/api/v0/leads/import")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"companyId\": \"<string>\",\n \"listId\": \"<string>\",\n \"filters\": {},\n \"segment\": [\n \"<string>\"\n ],\n \"audience\": {},\n \"daysBack\": 123,\n \"importAll\": true,\n \"count\": 123,\n \"audienceName\": \"<string>\",\n \"saveAudience\": true\n}"
response = http.request(request)
puts response.read_body{
"taskId": "<string>",
"listId": "<string>",
"status": "<string>",
"message": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Import leads into a smart list
Takes the same criteria as the generate endpoint but, instead of returning a sample, builds the full audience and writes every matching contact into the destination smart list as rows. The list must already exist — create one with the Lists API first and pass its id.
Runs in the background: responds 202 with a taskId as soon as the import is
queued, and rows appear in the list over the next few minutes. Costs 1 data
credit per contact imported. The credit check gates on the FULL match count,
not on count, because the whole audience is built regardless of how many
rows are imported — call the generate endpoint first to see totalAvailable.
curl --request POST \
--url https://api.parallellabs.app/api/v0/leads/import \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"companyId": "<string>",
"listId": "<string>",
"filters": {},
"segment": [
"<string>"
],
"audience": {},
"daysBack": 123,
"importAll": true,
"count": 123,
"audienceName": "<string>",
"saveAudience": true
}
'import requests
url = "https://api.parallellabs.app/api/v0/leads/import"
payload = {
"companyId": "<string>",
"listId": "<string>",
"filters": {},
"segment": ["<string>"],
"audience": {},
"daysBack": 123,
"importAll": True,
"count": 123,
"audienceName": "<string>",
"saveAudience": True
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
companyId: '<string>',
listId: '<string>',
filters: {},
segment: ['<string>'],
audience: {},
daysBack: 123,
importAll: true,
count: 123,
audienceName: '<string>',
saveAudience: true
})
};
fetch('https://api.parallellabs.app/api/v0/leads/import', 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.parallellabs.app/api/v0/leads/import",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'companyId' => '<string>',
'listId' => '<string>',
'filters' => [
],
'segment' => [
'<string>'
],
'audience' => [
],
'daysBack' => 123,
'importAll' => true,
'count' => 123,
'audienceName' => '<string>',
'saveAudience' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.parallellabs.app/api/v0/leads/import"
payload := strings.NewReader("{\n \"companyId\": \"<string>\",\n \"listId\": \"<string>\",\n \"filters\": {},\n \"segment\": [\n \"<string>\"\n ],\n \"audience\": {},\n \"daysBack\": 123,\n \"importAll\": true,\n \"count\": 123,\n \"audienceName\": \"<string>\",\n \"saveAudience\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.parallellabs.app/api/v0/leads/import")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"companyId\": \"<string>\",\n \"listId\": \"<string>\",\n \"filters\": {},\n \"segment\": [\n \"<string>\"\n ],\n \"audience\": {},\n \"daysBack\": 123,\n \"importAll\": true,\n \"count\": 123,\n \"audienceName\": \"<string>\",\n \"saveAudience\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parallellabs.app/api/v0/leads/import")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"companyId\": \"<string>\",\n \"listId\": \"<string>\",\n \"filters\": {},\n \"segment\": [\n \"<string>\"\n ],\n \"audience\": {},\n \"daysBack\": 123,\n \"importAll\": true,\n \"count\": 123,\n \"audienceName\": \"<string>\",\n \"saveAudience\": true\n}"
response = http.request(request)
puts response.read_body{
"taskId": "<string>",
"listId": "<string>",
"status": "<string>",
"message": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
Company API key - scoped to a specific company. Generate from the Integrations page in your dashboard.
Body
Lead import criteria plus the destination smart list
Company ID (bills its data credits)
Destination smart list id. Must already exist.
Attribute filters (each a string[] unless noted), in the exact audience-builder shape. Location: city, state, personalState (person's home state), zip. Person: age {minAge,maxAge}, gender. profile (nested object): incomeRange, netWorth, homeowner, married, children. attributes (nested object): credit_rating, credit_range_new_credit, credit_card_user, investment, cra_code, mortgage_amount {min,max}, occupation_group, ethnic_code, language_code, education, excludeEducation, smoker, single_parent, dwelling_type, estimated_home_value, home_year_built {min,max}, home_purchase_price {min,max}, home_purchase_year {min,max}. Contact quality: notNulls (fields that must be present). businessProfile (nested object): industry, seniority, department, jobTitle, excludeJobTitle, jobTitleMatchMode (string, "contains" default or "exact"), companyName, companyDomain, companyDescription, employeeCount, companyRevenue, sic, companyNaics. Use lead_field_options for the enumerated fields' valid values.
Premade segment externalIds from lead_segments (e.g. "b2b_12636", "b2c_1253").
Buyer-intent keyword search — the highest-signal input. { segmentSearches: string[] } is free-text topics the lead is actively shopping for (e.g. ['CRM software']); optional b2b: bool biases to business vs consumer intent. Distinct from filters.businessProfile.companyDescription, which describes what the company IS. Combine with filters to intersect intent and firmographics.
Recency window for intent data, 2-10, default 7.
true = import every matching contact. Defaults to true only when no count is given; pass count to import a slice.
Max contacts to import. Required when importAll is false. Note the full audience is still built vendor-side.
Name for the generated audience. Default "Leads".
Attach this configuration to the list so it can be edited and auto-refreshed later. Ignored when the list already has an audience — an existing one is never overwritten.

