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,
"billingLock": {}
}{
"error": "<string>",
"code": "<string>",
"details": "<unknown>"
}List leads
List and filter the workspace’s leads, newest first. 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.
When the workspace is locked for billing, the response keeps the same shape but carries billingLock, and leads holds placeholder rows rather than real leads. Check for billingLock before you store or act on the rows.
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,
"billingLock": {}
}{
"error": "<string>",
"code": "<string>",
"details": "<unknown>"
}Authorizations
A ManyPI API key (mpi_...) from the profile menu → API Access in the dashboard, 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.
Present only when the workspace is locked for billing. leads then holds placeholder rows and total is the number of real leads waiting behind the lock.
