List prospects (cold leads)
curl --request GET \
--url https://app.outboundlegal.com/api/v1/prospects \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.outboundlegal.com/api/v1/prospects"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.outboundlegal.com/api/v1/prospects', 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.outboundlegal.com/api/v1/prospects",
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.outboundlegal.com/api/v1/prospects"
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.outboundlegal.com/api/v1/prospects")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.outboundlegal.com/api/v1/prospects")
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{
"data": [
{
"id": "3f9c2d7a-58e1-4b6a-9c0d-1e2f3a4b5c6d",
"lead_type": "cold",
"source": "OutboundLegal",
"first_name": "Ana",
"last_name": "Diaz",
"address": {
"line1": "12 Elm St",
"city": "Newark",
"state": "NJ",
"zip": "07102"
},
"accident": {
"date": "2026-09-30",
"city": "Newark",
"county": "Essex",
"state": "NJ"
},
"injured": true,
"added_at": "2026-10-01T14:03:22.123456+00:00"
}
],
"next_cursor": "<string>"
}{
"error": {
"code": "invalid_request",
"message": "limit must be a whole number from 1 to 100."
}
}{
"error": {
"code": "unauthorized",
"message": "Send your API key as: Authorization: Bearer obl_…"
}
}{
"error": {
"code": "bundle_required",
"message": "Sending prospects to your CRM is part of the digital bundle."
}
}{
"error": {
"code": "cursor_stale",
"message": "Your county access changed since this cursor was issued. Start again without a cursor."
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests. The limit is 120 per minute per key."
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
}
}Prospects
List prospects (cold leads)
Crash prospects in your counties, as cold leads: people who have not contacted your firm. These are the same prospects you see on your Prospects pages. Needs the digital bundle.
order=oldest(default): full sync, oldest first. Keep passingnext_cursoruntil it’snull. A prospect shows up here about an hour after it’s added, so paging never skips one.order=newest: the newest prospects from the last 30 days, no cursor. For polling tools (like Zapier) that skip ids they’ve already seen.
If your county access changes, an old cursor gets 409 cursor_stale: start again without a cursor. Re-syncing from the start about once a week is a good habit; matching on id keeps it from creating duplicates.
GET
/
prospects
List prospects (cold leads)
curl --request GET \
--url https://app.outboundlegal.com/api/v1/prospects \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.outboundlegal.com/api/v1/prospects"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.outboundlegal.com/api/v1/prospects', 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.outboundlegal.com/api/v1/prospects",
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.outboundlegal.com/api/v1/prospects"
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.outboundlegal.com/api/v1/prospects")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.outboundlegal.com/api/v1/prospects")
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{
"data": [
{
"id": "3f9c2d7a-58e1-4b6a-9c0d-1e2f3a4b5c6d",
"lead_type": "cold",
"source": "OutboundLegal",
"first_name": "Ana",
"last_name": "Diaz",
"address": {
"line1": "12 Elm St",
"city": "Newark",
"state": "NJ",
"zip": "07102"
},
"accident": {
"date": "2026-09-30",
"city": "Newark",
"county": "Essex",
"state": "NJ"
},
"injured": true,
"added_at": "2026-10-01T14:03:22.123456+00:00"
}
],
"next_cursor": "<string>"
}{
"error": {
"code": "invalid_request",
"message": "limit must be a whole number from 1 to 100."
}
}{
"error": {
"code": "unauthorized",
"message": "Send your API key as: Authorization: Bearer obl_…"
}
}{
"error": {
"code": "bundle_required",
"message": "Sending prospects to your CRM is part of the digital bundle."
}
}{
"error": {
"code": "cursor_stale",
"message": "Your county access changed since this cursor was issued. Start again without a cursor."
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests. The limit is 120 per minute per key."
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
}
}Authorizations
An API key from Settings → Integrations → API keys. Keys look like obl_ followed by 43 letters, numbers, - or _.
Query Parameters
oldest for a full sync with cursors, newest for polling.
Available options:
oldest, newest How many prospects per response: 1 to 100 with order=oldest, 1 to 500 with order=newest.
Required range:
1 <= x <= 500The next_cursor from the previous page. Only works with order=oldest.

