curl --request GET \
--url https://app.manypi.com/api/leads \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.manypi.com/api/leads"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.manypi.com/api/leads', 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://app.manypi.com/api/leads",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://app.manypi.com/api/leads"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.manypi.com/api/leads")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.manypi.com/api/leads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"leads": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"company": "<string>",
"full_name": "<string>",
"title": "<string>",
"email": "<string>",
"phone": "<string>",
"domain": "<string>",
"linkedin_url": "<string>",
"location": "<string>",
"source_url": "<string>",
"score": 123,
"status": "new",
"custom": {},
"email_status": "valid",
"email_provider": "<string>",
"email_is_role": true,
"email_validated_at": "2023-11-07T05:31:56Z",
"unsubscribed_at": "2023-11-07T05:31:56Z",
"archived_at": "2023-11-07T05:31:56Z",
"agent_run_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z"
}
],
"total": 123,
"workspaceTotal": 123,
"customColumns": [
"<string>"
],
"customFields": [
{
"key": "<string>",
"label": "<string>",
"type": "<string>",
"description": "<string>",
"auto_research": true,
"declared": true
}
],
"campaigns": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"label": "<string>",
"count": 123,
"created_at": "2023-11-07T05:31:56Z"
}
],
"leadLimit": 123
}{
"error": "<string>",
"code": "<string>"
}List leads
List and filter the workspace’s leads. Also returns the declared custom columns, the past lead searches that produced these leads, the workspace total and the plan’s lead limit — everything a grid needs in one call.
Requires the read permission.
curl --request GET \
--url https://app.manypi.com/api/leads \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.manypi.com/api/leads"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.manypi.com/api/leads', 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://app.manypi.com/api/leads",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://app.manypi.com/api/leads"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.manypi.com/api/leads")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.manypi.com/api/leads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"leads": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"company": "<string>",
"full_name": "<string>",
"title": "<string>",
"email": "<string>",
"phone": "<string>",
"domain": "<string>",
"linkedin_url": "<string>",
"location": "<string>",
"source_url": "<string>",
"score": 123,
"status": "new",
"custom": {},
"email_status": "valid",
"email_provider": "<string>",
"email_is_role": true,
"email_validated_at": "2023-11-07T05:31:56Z",
"unsubscribed_at": "2023-11-07T05:31:56Z",
"archived_at": "2023-11-07T05:31:56Z",
"agent_run_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z"
}
],
"total": 123,
"workspaceTotal": 123,
"customColumns": [
"<string>"
],
"customFields": [
{
"key": "<string>",
"label": "<string>",
"type": "<string>",
"description": "<string>",
"auto_research": true,
"declared": true
}
],
"campaigns": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"label": "<string>",
"count": 123,
"created_at": "2023-11-07T05:31:56Z"
}
],
"leadLimit": 123
}{
"error": "<string>",
"code": "<string>"
}Authorizations
A ManyPI API key (mpi_...) from Settings → API keys, or an OAuth 2.1 access token obtained through the MCP consent flow.
Query Parameters
Free text across company, full name, email and domain.
A lead status, or archived / unsubscribed (which are flags, not statuses).
new, qualified, contacted, disqualified, archived, unsubscribed The agent run id of the lead search that produced the leads.
Narrow to one brand, or all for the whole workspace.
Max 500.
x <= 500Response
Leads and grid metadata.
Show child attributes
Show child attributes
Rows matching the current filter.
Every lead the workspace stores, ignoring filters.
Show child attributes
Show child attributes
Past lead searches, with how many leads each produced.
Show child attributes
Show child attributes
Stored-lead cap for the plan.
