curl --request GET \
--url https://app.reputably.net/api/entities/Lead/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.reputably.net/api/entities/Lead/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.reputably.net/api/entities/Lead/{id}', 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.reputably.net/api/entities/Lead/{id}",
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.reputably.net/api/entities/Lead/{id}"
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.reputably.net/api/entities/Lead/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.reputably.net/api/entities/Lead/{id}")
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{
"id": "<string>",
"mention_id": "<string>",
"tracker_id": "<string>",
"location_id": "<string>",
"intent_score": 123,
"intent_reason": "<string>",
"stage": "new",
"stage_changed_at": "<string>",
"notes": "<string>",
"assigned_to": "<string>",
"lost_reason": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"phone": "<string>",
"email": "<string>",
"suburb": "<string>",
"postcode": "<string>",
"source": "<string>",
"is_archived": true,
"archived_at": "<string>",
"seen_at": "<string>",
"stale_post": true,
"stale_post_age_days": 123
}Get one lead
Reads a single lead by id. Ids do not cross workspaces.
curl --request GET \
--url https://app.reputably.net/api/entities/Lead/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.reputably.net/api/entities/Lead/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.reputably.net/api/entities/Lead/{id}', 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.reputably.net/api/entities/Lead/{id}",
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.reputably.net/api/entities/Lead/{id}"
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.reputably.net/api/entities/Lead/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.reputably.net/api/entities/Lead/{id}")
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{
"id": "<string>",
"mention_id": "<string>",
"tracker_id": "<string>",
"location_id": "<string>",
"intent_score": 123,
"intent_reason": "<string>",
"stage": "new",
"stage_changed_at": "<string>",
"notes": "<string>",
"assigned_to": "<string>",
"lost_reason": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"phone": "<string>",
"email": "<string>",
"suburb": "<string>",
"postcode": "<string>",
"source": "<string>",
"is_archived": true,
"archived_at": "<string>",
"seen_at": "<string>",
"stale_post": true,
"stale_post_age_days": 123
}Authorizations
An agent key (rpk_...) created in Settings → API & MCP, sent as Authorization: Bearer rpk_.... Bearer only: a cookie session can never drive this API. An OAuth 2.1 access token obtained from the same host works identically and lands on the same ceiling.
Headers
Which workspace to read. Omit it and you get the account’s home workspace, which on an agency account is often not where the live businesses are. A workspace this credential cannot read is refused with 403 rather than quietly answered from the default.
Path Parameters
The lead id.
Response
The lead.
Unique id.
new, contacted, qualified, won, lost Internal visibility flag, NOT a client notification: the source post was already older than LEAD_STALE_POST_FLAG_DAYS (default 30) when we discovered it. Stamped once at dispatch time by lib/notificationChannels.js and never recomputed — the fact worth keeping is 'the post was already this old when we found it', which a live now-minus-posted_at would lose as the lead ages on the board. ~2/day in practice, almost all Reddit threads that are topically correct but commercially dead.
Age of the source post in days at the moment the lead was dispatched. Set alongside stale_post. Deepest observed: 5,408 days (a 2011 r/australia thread).